Introdução à Ciência da Computação (ICC) 2001.1 - DI PUC-Rio

Propaganda
Introdução à Ciência da Computação (ICC) 2001.1
PROVA P2
Sexta-feira 1 de Junho de 2001
Nome do Aluno: ____________________________________________________
Matrícula PUC: ______________________________________________________
Questões
1
(1.5)
2
(1.5)
3a
(1.0)
3b
(1.0)
3c
(1.0)
3d
(1.0)
4
(2.0)
P2
Revisão
Prova (max 9.0)
Testes (max 1.0)
Grau G2
OBSERVAÇÕES
1. A prova é SEM CONSULTA e SEM PERGUNTAS.
2. Procure responder apenas no espaço indicado. Não serão consideradas respostas
apresentadas em folhas de papel extra.
3. Na elaboração das respostas, QUALQUER FUNÇÃO AUXILIAR DEVE SER DEFINIDA
POR VOCÊ, exceto os predicados e funções pré-definidos do Scheme (por exemplo,
even?, odd?, zero?, null?, sin, cos, sqrt, quotient, remainder… ), os operadores
lógicos (and, or, not), as funções básicas para manipulação de listas (cons, car e
cdr), as formas compactas para ninhos de car e cdr (por exemplo, cadr, caddr, …)
e as funções explicitamente autorizadas no enunciado da questão.
4. Duração máxima da prova: 1:45 h
QUESTÃO 1 (Padrões de recursão) Seja uma lista de números, cada um representando o salário
dos funcionários de uma determinada empresa. Escreva uma função em Scheme que exiba em
uma nova lista os salários dos funcionários que ganham acima de 500 reais aumentados em
10%. Por exemplo:
(fq1 '(300 1000 700 120)) -> (1100 770).
(fq1 '(300 100 400 120)) -> ( ).
(fq1 '(1500 1000 700 2000)) -> (1650 1100 770 2200).
Dica: se necessário, usar, sem precisar definir, os padrões de recursão vistos no curso de filtragem (filtra F L) - e mapeamento - (mapeia F L) ou (map F L) – com F sendo a função (ou predicado) de
mapeamento/filtragem e L a lista de entrada.
QUESTÃO 2 (Manipulação de Árvores Binárias) De acordo com o que foi visto nas aulas, considere a
representação de arvores binárias como como listas pré-fixadas e as seguintes funções básicas:
(define arvore-vazia '())
(define vazia? null?)
(define (folha? a) ( not (list? a) ))
(define (raiz a)
(if (folha? a) a (car a)) )
(define (esquerda a)
(if (folha? a) arvore-vazia (cadr a)) )
(define (direita a)
(if (folha? a) arvore-vazia (caddr a)) )
No caso das funções raiz, esquerda e folha, lembrar que assume-se que a árvore binária de
entrada nunca é vazia. Escreva a função conta-impar que conta quantos elementos de uma
dada árvore binária são ímpares. Por exemplo:
(define AQ2 '(5 (2 () 3) (9 8 11)) )
(conta-impar AQ2) -> 4
Atenção: é OBRIGATÓRIO usar apenas as funções relembradas acima quando for preciso operar sobre
árvores, procedendo com a abstração das convenções adotadas e da representação interna por listas!
Considere também a lista C contendo
a relação dos países que pertencem a cada continente. Cada elemento da lista é, por sua vez,
uma lista cujo primeiro elemento é a sigla do continente e o segundo elemento é a lista de
siglas dos países localizados neste continente. Por exemplo:
QUESTÃO 3
C=(
(Conjuntos, Tabelas e Á rvores Binárias de Busca)
( “AS” (“BRA” “ARG” “VEN”) )
( “AN” (“EUA” “CAN” “MEX”) ) )
Representamos a America do Sul por “AS” e a America do Norte por “AN”. Consideramos
também siglas de países como “CAN”para Canadá ou “BRA”para Brasil.
(3a) Implemente o predicado pertence? para verificar se um literal X (sigla de país) pertence
ou não a uma lista de literais L (com siglas de países). Utilizar, se necessário, o predicado
string=? do Scheme para comparar se dois literais (textos) são iguais. Exemplos:
(pertence? “VEN” ´(“BRA” “ARG” “VEN”)) => #t
(pertence? “CHI” ´(“BRA” “ARG” “VEN”)) => #f
(3b) Se definirmos como “vizinhos” dois países localizados em um mesmo continente, escreva
um predicado vizinhos? para verificar se o país com sigla X é vizinho ou não do país com sigla
Y. Além dos parâmetros X e Y, é fornecida na entrada a lista C de continentes. O predicado
pertence? (item 3a) pode ser usado aqui mesmo que não tenha sido definido. Por exemplo:
(vizinhos? "BRA" "VEN" C) => #t
(vizinhos? "BRA" "EUA" C) => #f
(3c) Escreva uma função que retorna o continente no qual está localizado um determinado
país, sendo passados como parâmetros a sigla X do país e a lista C de continentes. Exemplos:
(continente “BRA” C) => “AS”
(continente “EUA” C) => “AN”
(continente “CHI” C) => “ ”
(3d) Desenhe uma arvore binária de busca cujos elementos sejam as siglas dos países
exemplificados no conjunto abaixo, considerando-se a ordem alfabética.
{ “CAN”, “RUS”, “BRA”, “ARG”, “EUA”, “MEX”, “VEN”, “FRA”, “CHI” , “CUB”, “JAP”, “ALE”, “ESP”}
Mostre também a representação em lista pré-fixada (scheme) da árvore binária de busca
ilustrada em seu desenho.
QUESTÃO 4 (Representação de Números Naturais) Como visto na apostila, se os números naturais
são representados por listas de átomos cujos comprimentos correspondem ao número natural
desejado – por exemplo, o número 1 seria a lista (1), o número 2 a lista (1 1) e assim por
diante – podemos definir algumas operações primitivas sobre os naturais da seguinte forma:
(define
(define
(define
(define
zero ‘( ) )
zer? null? )
inc (lambda (n) (cons 1 n) ))
dec (lambda (n) (cdr n) ))
Assim, a operação de somar dois números pode ser definida como:
(define soma (lambda (n1 n2)
(if (zer? n2)
n1
(inc (soma n1 (dec n2) ) )
)))
que continuaria funcionando corretamente caso sejam redefinidas as operações primitivas
acima, utilizando a representação de números naturais habitual, isto é, o zero ser o número 0,
o símbolo + usado para contas de somar, etc. Definir agora uma função potência sobre
números naturais, não considerando sua representação, que calcula o valor de um número
elevado a outro. Por exemplo,
(potencia 2 3) à 8
(potencia 3 2) à 9
Você pode supor disponível (isto é, não é necessário definir) a função mult, que retorna o
resultado da multiplicação de dois números naturais. Por exemplo: (mult 4 3) à 12
Obs. Lembrar de propor uma solução conceitual usando apenas um método indutivo (ou seja, sem
escrever um programa em Scheme) para justificar sua resposta.
Download