Você está na página 1de 78

Exerccios para

Fundamentos da Programao
Utilizando Mltiplos Paradigmas

Pedro Ado, Fausto Almeida, Ana Cardoso-Cachopo, Pedro Amaro de Matos (editores)

Departamento de Engenharia Informtica


Instituto Superior Tcnico
Universidade Tcnica de Lisboa
2
3

Prembulo
O objectivo desta publicao disponibilizar um conjunto de exerccios que permitam aos alu-
nos da disciplina de Fundamentos de Programao da Licenciatura em Engenharia Informtica
e de Computadores do Instituto Superior Tcnico consolidarem os conhecimentos adquiridos
ao longo do semestre.
Os exerccios esto divididos de acordo com os captulos do livro adoptado na disciplina:
Fundamentos da Programao Utilizando Mltiplos Paradigmas, de Joo Pavo Martins e
Maria dos Remdios Cravo, editado pela IST Press em 2011. Sempre que tal foi considerado
relevante, os exerccios foram subdivididos de acordo com o seu tipo.
Chama-se a ateno dos alunos para a indicao do nvel de dificuldade de 1 a 4, corres-
pondendo o nvel 1 a exerccios muito fceis e o nvel 4 a exerccios francamente difceis. Esta
informao apresentada dentro de um quadrado cinzento antes do enunciado do exerccio a
que diz respeito.
Alguns destes exerccios correspondem a exerccios propostos nas sebentas (a) Exerccios da
cadeira de Introduo Programao, Cludia Antunes, Ana Cardoso Cachopo, Joo Cachopo,
Francisco Couto, Antnio Leito, Ins Lynce, Csar Pimentel e H. Sofia Pinto, editados por
Ins Lynce, 2002, e (b) Exerccios para Programao em Scheme: Introduo Programao
Utilizando Mltiplos Paradigmas, Departamento de Engenharia Informtica, IST.
4
Contedo

1 Noes bsicas 7
1.1 Exerccios de reviso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
1.2 Exerccios de programao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2 Abstraco Procedimental 11
2.1 Exerccios de reviso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2 Exerccios de programao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.1 Avaliao de Expresses . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.2 Definio de Procedimentos . . . . . . . . . . . . . . . . . . . . . . . . . 13
2.2.3 Recurso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
2.2.4 Valores aproximados de funes . . . . . . . . . . . . . . . . . . . . . . . 23

3 Processos gerados por procedimentos 25


3.1 Exerccios de reviso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
3.2 Exerccios de programao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

4 Estruturao de Procedimentos 37
4.1 Exerccios de reviso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.2 Exerccios de programao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.2.1 Estrutura de Blocos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
4.2.2 Utilizao de Nomes Locais . . . . . . . . . . . . . . . . . . . . . . . . . 39

5 Abstraco de dados 43
5.1 Exerccios de reviso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.2 Exerccios de programao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2.1 Caixas e ponteiros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2.2 Tipo tempo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2.3 Tipo data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.2.4 Complexos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.2.5 Listas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.2.6 rvores Binrias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

6 Procedimentos de ordem superior 65


6.1 Exerccios de reviso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
6.2 Exerccios de programao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
6.2.1 Procedimentos que recebem procedimentos . . . . . . . . . . . . . . . . 65
6.2.2 Procedimentos que produzem procedimentos . . . . . . . . . . . . . . . . 71

5
6 CONTEDO

7 O desenvolvimento de programas 77
7.1 Exerccios de reviso . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
7.2 Exerccios de programao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Captulo 1

Noes bsicas

1.1 Exerccios de reviso


1. O que um processo computacional? Qual a relao entre um programa e um processo
computacional?

2. O que um algoritmo? Explique cada uma das suas caractersticas: rigor, eficcia e
garantia de terminao.

3. O que um programa? Qual a sua relao com um algoritmo?

4. O que a abordagem do topo para a base? Aplique-a soluo de um problema sua


escolha.

5. Em que consiste a abstraco? Qual a sua vantagem?

6. Explique em que consiste o ciclo l-avalia-escreve.

7. O que so a sintaxe e a semntica de uma linguagem? Como se descrevem?

8. D um exemplo de cada um dos seguintes tipos de entidades existentes em Scheme:

(a) Constante.
(b) Procedimento primitivo.
(c) Combinao.
(d) Forma especial.

9. Diga o que uma combinao, apresentando a sua sintaxe em notao BNF e explicando
informalmente os smbolos no terminais que a compem.

10. Quais os passos seguidos pelo Scheme na avaliao de uma combinao?

11. O que um predicado? D um exemplo.

12. O que uma definio recursiva? Quais as partes que a compem?

13. Considere a operao de nomeao em Scheme.

(a) Qual a sintaxe e a semntica da operao de nomeao?

7
8 CAPTULO 1. NOES BSICAS

(b) Explique a razo de esta operao corresponder a uma forma especial.


(c) Qual a necessidade da definio desta operao?

14. O que um ambiente?

1.2 Exerccios de programao


1. (1) Instale o Scheme no seu computador seguindo as instrues do Manual de Sobre-
vivncia em Scheme.

2. (1) Na janela de interaco do Scheme execute as seguintes aces:

(a) Avalie a constante inteira correspondente ao seu nmero de aluno.


(b) Avalie a cadeia de caracteres correspondente ao seu nome completo.
(c) Calcule a diferena entre 2007 e o seu ano de nascimento.
(d) Calcule a rea de um crculo com dimetro 10.
(e) Calcule a razo entre a rea de um quadrado com 10 de lado e a rea de um crculo
com dimetro 10.

3. (1) Converta as seguintes expresses para a notao do Scheme:

(a) (1 + 5) 6 12/3
(b) 2 + 3 4/5
(c) (8 + 7 9/3 2) (8/4 9 + 3)

4. (2) Traduza as seguintes expresses para notao prefixa e calcule o seu valor utilizando
o interpretador do Scheme. Mostre a rvore de avaliao para cada uma delas utilizando
o modo de avaliao de expresses em Scheme.

(a) (5 + 4 3)/(2 + 1)
(b) (5 + 4) 3/2 1
(c) 1 + 2 3/4 5 6/(7 + 8)

5. (1) Suponha que as seguintes expresses so avaliadas pelo Scheme. Na linha imedia-
tamente a seguir a cada uma delas diga o que escrito pelo interpretador do Scheme (se
a avaliao de alguma das expresses der origem a um erro, explique a razo do erro).

(a) (+ 1 20)
(b) (1 + 20)

6. (1) Considere uma mscara de papel feita a partir um crculo de papel de raio 5. Os
dois olhos so crculos de raio 1 recortados, o nariz um quarto de crculo de raio 3
recortado e a boca corresponde a meio crculo de raio 3, tambm recortado. Escreva
uma expresso em Scheme para calcular a rea ocupada pela mscara.

(a) Escreva o cdigo em texto corrido usando os valores apropriados.


(b) Escreva o cdigo usando a indentao elegante.
1.2. EXERCCIOS DE PROGRAMAO 9

(c) Escreva o cdigo definindo nomes Raio-Face, Raio-Olhos, Raio-Nariz, Raio-Boca


para os raios dos crculos referidos.
(d) Escreva o cdigo utilizando os nomes Area-Face, Area-Olhos, Area-Nariz, Area-Boca,
com os valores apropriados.
(e) Avalie cada uma das respostas das alneas anteriores quanto legibilidade do cdigo.

7. (1) Suponha que as seguintes expresses so avaliadas pela ordem apresentada. Diga
o que escrito pelo interpretador do Scheme. Se a avaliao de alguma das expresses
der origem a um erro, explique a razo do erro.

(a) (* 4 (+ 1 7.0))
(b) (define a 5)
(c) (+ a b)
(d) (define b (* (+ 5 a) (+ 2 56)))
(e) (+ a b)
(f) a
(g) (define a (+ a 2))
(h) a
(i) +
(j) 7.0
(k) (* 2 (/ 8 4))
(l) (+ 3 #f)
(m) (define a a)
(n) a

8. (1) Diga qual o resultado de avaliar cada uma das seguintes formas.
Se a avaliao de uma forma no produzir resultados escreva -nada-.
Se a avaliao de uma forma produzir um erro, explique a sua razo.

(a) (and (> 3 5) (/ 3 0))


(b) (and (/ 3 0) (> 3 5))
(c) (+ 8 (max 3 2))
(d) (define a 5)
10 CAPTULO 1. NOES BSICAS
Captulo 2

Abstraco Procedimental

2.1 Exerccios de reviso


1. Diga qual a diferena entre uma funo matemtica e um procedimento em Scheme para
o clculo dessa funo.

2. Explique o que so os parmetros formais e o que so os parmetros concretos, referindo,


em particular onde aparecem os parmetros formais e onde aparecem os parmetros
concretos e quando e como que os parmetros formais so associados com os parmetros
concretos.

3. Utilizando a notao BNF, apresente a definio de uma expresso lambda. Explique


cada um dos constituintes da sua definio.

4. O que um procedimento annimo? D um exemplo.

5. Diga o que abstraco procedimental e qual a sua vantagem.

6. Escreva as regras seguidas pelo Scheme para a avaliao de uma expresso.

7. O que um ambiente local? Qual o significado de dizer que um nome est ligado num
ambiente?

2.2 Exerccios de programao


2.2.1 Avaliao de Expresses
1. (1) Avalie as seguintes formas. Se alguma das avaliaes der origem a um erro, explique
qual a razo do erro.

(a) (3 1)
(b) ((lambda (x) (+ 2 x)) 3)
(c) ((lambda (x) ((lambda (y) (* y 2)) (+ x 3))) 4)
(d) ((lambda (x) (+ x 3)) ((lambda (y) (* y 2)) 4))
12 CAPTULO 2. ABSTRACO PROCEDIMENTAL

2. (1) Diga qual o resultado de avaliar cada uma das seguintes formas. Considere que
estas so fornecidas ao avaliador do Scheme pela ordem apresentada (e consequentemente
cada forma dependente das anteriores).
Se a avaliao de uma forma no produzir resultados escreva -nada-. Se a avaliao de
uma forma produzir um erro, explique a sua razo.

(a) (define a 5)
(b) (if (odd? a) (+ a 2) (* a 3))
(c) (lambda (x) (+ b x))
(d) ((lambda (x)(+ a x)) b)

3. (1) Considere o procedimento

(define (cont n)
(if (< n 0)
0
(+ 2 (cont (- n 3)))))

Com base nas regras de avaliao, desenhe a rvore que representa o funcionamento
deste procedimento com a avaliao de (cont 5).

4. (1) Considere o procedimento

(define (proc n)
(cond ((= n 0) 1)
((= n 1) 1)
(else (+ 3 (proc (- n 3))))))

Com base nas regras utilizadas pelo interpretador do Scheme para avaliar uma com-
binao, desenhe a rvore que representa o funcionamento deste procedimento com a
avaliao de (proc 3).

5. (1) Considere a seguinte interaco com o Scheme:

> (define (f x) (+ x 2))


> (define (g x) (* 2 (f x)))
> (define (h x) (f (* 2 x)))
> (g 3)
10
> (h 3)
8

Com base nas regras utilizadas pelo interpretador do Scheme para avaliar uma combi-
nao, desenhe as rvores que representam o funcionamento destes procedimentos com
a avaliao de (g 3) e de (h 3).
2.2. EXERCCIOS DE PROGRAMAO 13

6. (2) Repare que o nosso modelo de avaliao permite a existncia de combinaes cujos
operadores so expresses compostas. Use esta observao para descrever o comporta-
mento do seguinte procedimento:1

(define (a-plus-abs-b a b)
((if (> b 0) + -) a b))

7. (2) Considere a seguinte interaco em Scheme:

> (define (f1 x) (* x x))


> (f1 5)
25
> (define f2 f1)

(a) Qual o valor de (f2 5)? Justifique a sua resposta.


(b) Suponha que agora definia o procedimento f2, do seguinte modo:
> (define (f2 x) (+ x 10))
Quais os valores de (f1 5) e de (f2 5)? Justifique a sua resposta.

8. (2) Considere a seguinte definio:

(define f ((lambda (x) (lambda (y) x)) 1)).

Diga quais os resultados da avaliao sequencial das seguintes expresses. Se alguma


das expresses produzir um erro, explique a razo do erro.

(a) (f 2)
(b) (define g (f 3))
(c) (g 4)
(d) (define h f)
(e) (h 6)

2.2.2 Definio de Procedimentos


1. (1) Escreva um procedimento annimo que soma dois ao seu argumento.

2. (1) Escreva um procedimento annimo para representar a funo de um argumento


(x) cujo valor calculado por (x 32) 5/9.

3. (1) Escreva um procedimento annimo para representar a funo de dois argumentos


(x e y) cujo valor calculado por (x + 3 y) (x y).

4. (1) Escreva o procedimento dobro que devolve o dobro do seu argumento.


1
Exerccio 1.4 de Abelson H., Sussman G. J., e Sussman J., Structure and Interpretation of Computer
Programs, 2a Edio, p. 21, 1996.
14 CAPTULO 2. ABSTRACO PROCEDIMENTAL

5. (1) Escreva o procedimento metade que recebe um nmero inteiro positivo e devolve
um nmero racional que corresponde a metade do seu argumento.

6. (1) Escreva um procedimento horas->dias que recebe um inteiro correspondente a


um certo nmero de horas e que devolve um nmero real que traduz o nmero de dias
correspondentes ao seu argumento.

> (horas->dias 48)


2.0
> (horas->dias 10)
0.4166666666666667

7. (2) Escreva o procedimento digitos->numero que recebe como argumentos trs dgitos
e produz o nmero inteiro de trs algarismos constitudo pelos seus argumentos e pela
ordem em que aparecem.

> (digitos->numero 3 2 8)
328

8. (1) Escreva um procedimento area-circulo que calcula a rea de um crculo cujo raio
r. Note-se que esta rea dada pela frmula r2 .

9. (2) Utilizando o procedimento area-circulo do exerccio anterior, escreva um proce-


dimento area-coroa que calcula a rea de uma coroa circular de raio interior r1 e raio
exterior r2 .

10. (1) Defina o procedimento media que recebe dois argumentos que devem ser nmeros
e devolve o nmero real que corresponde mdia dos seus argumentos.

11. (1) Escreva um procedimento sinal, que receba um inteiro e devolva 1, 1 ou 0, caso
o nmero seja, respectivamente, maior, menor ou igual a zero.

12. (1) Escreva o procedimento intermedio que recebe trs nmeros e devolve o nmero
com o valor intermdio.

13. (3) Escreva um procedimento quant->qual, que recebe um real, representando uma
nota quantitativa de um aluno (entre 0 e 20), e a transforma numa constante do tipo
cadeia de caracteres que corresponde a uma nota qualitativa, de acordo com a tabela

Nota Nota
quantitativa qualitativa
18 a 20 Muito Bom
14 a 17 Bom
10 a 13 Suficiente
5a9 Mediocre
0a4 Mau

A nota recebida dever ser convertida para um nmero inteiro, antes da converso para
a nota qualitativa.
2.2. EXERCCIOS DE PROGRAMAO 15

14. (1) Escreva um procedimento que recebe as notas de um aluno de uma disciplina C1
(nota do projecto, mdia dos trabalhos das prticas, nota do teste, e nota do exame
final) e calcula a sua nota final de acordo com as seguintes regras:

(a) A nota na disciplina ser calculada por uma mdia ponderada da classificao
obtida nas provas realizadas, com os seguintes pesos: projecto 25%; trabalhos de
casa e aulas prticas 10%; teste 20%; exame final 45%.
(b) Para obter aprovao na disciplina, a nota do exame ter de ser superior a 7,5
valores, a nota do projecto ter de ser superior a 9,5 valores e a mdia ponderada
da disciplina ter de ser superior a 9,5 valores.

O seu procedimento deve devolver a nota final da disciplina (um inteiro) no caso de o
aluno ter sido aprovado ou zero no caso do aluno ter sido reprovado.

15. (1) Utilizando os procedimentos desenvolvidos nos exerccios 13 e 14, escreva um proce-
dimento em Scheme que recebe as notas de um aluno da disciplina C1 (nota do projecto,
mdia dos trabalhos das prticas, nota do teste, e nota do exame final) e calcula a sua
nota qualitativa final.

16. (3) O procedimento primitivo round, quando a parte decimal do nmero a arredondar
0.5, arredonda por excesso ou por defeito (em termos de valor absoluto), consoante a
parte inteira seja mpar ou par. Por exemplo,

> (round 5.5)


6.0
> (round 6.5)
6.0

Escreva um procedimento arredonda que arredonda sempre por excesso (em termos de
valor absoluto), quando a parte decimal do nmero 0.5. Por exemplo,

> (arredonda 5.5)


6.0
> (arredonda 6.5)
7.0
> (arredonda -6.5)
-7.0

17. (2) Escreva um procedimento cinco? que tem o valor verdadeiro se o seu argumento
for 5 e falso no caso contrrio. No utilize o if, nem o cond, nem #t nem #f.

18. (2) Escreva um procedimento (entre? val x y) que devolve verdadeiro, no caso de
val se encontrar entre x e y (x < val < y) e falso no caso contrrio.

19. (2) Escreva o procedimento bissexto? para verificar se um ano bissexto. Um ano
bissexto se for divisvel por 4 e no for divisvel por 100, a no ser que seja tambm
divisvel por 400. Por exemplo, 1984 bissexto, 1100 no , e 2000 bissexto.
16 CAPTULO 2. ABSTRACO PROCEDIMENTAL

> (bissexto? 2000)


#t
> (bissexto? 1900)
#f

20. (2) Escreva o procedimento data-valida? para verificar se uma data vlida. O seu
procedimento deve receber 3 inteiros, em que o primeiro representa o ano, o segundo, o
ms, e o terceiro, o dia, e verificar se a data correspondente existe no calendrio. Por
exemplo, 1998 2 29 e 1945 4 31 no so datas vlidas (porque 1998 no bissexto e Abril
s tem 30 dias, respectivamente) mas 2000 2 29 uma data vlida.

> (data-valida? 31 1 2000)


#t
> (data-valida? 29 2 1900)
#f
> (data-valida? 31 4 2000)
#f

21. (2) Se a, b e c representam as dimenses dos lados de um tringulo, escreva um procedi-


mento triangulo? que devolve verdadeiro se os valores de a, b e c puderem corresponder
a lados de um tringulo e falso no caso contrrio. Note que a, b e c podem representar as
dimenses dos lados de um tringulo se: (a) nenhum dos valores a, b e c for negativo ou
nulo; (b) a soma de quaisquer destes valores for maior do que o terceiro (num tringulo,
qualquer lado menor do que a soma dos outros dois).

22. (2) Escreva o procedimento classifica que recebe trs nmeros correspondentes aos
comprimentos dos lados de um tringulo e decide se o tringulo equiltero, issceles
ou escaleno.

23. (2) Escreva um procedimento triangulo-rect?, que recebe trs nmeros inteiros po-
sitivos e determina se estes correspondem aos comprimentos dos lados de um tringulo
rectngulo.
O seu procedimento dever satisfazer as seguintes condies:

O procedimento devolve verdadeiro no caso dos valores recebidos corresponderem


aos comprimentos dos lados de um tringulo rectngulo e falso em caso contrrio.
O funcionamento do procedimento independente da ordem pela qual os valores
lhe so fornecidos.
O procedimento verifica se os valores fornecidos e correspondem a inteiros positivos,
produzindo uma mensagem em caso de no corresponderem.

Note que num tringulo rectngulo, o quadrado de um dos lados igual soma dos
quadrados dos outros dois.

24. (2) Escreva o procedimento idade que recebe como argumentos seis nmeros inteiros
correspondentes a duas datas (um dia, ms, ano para cada data), sendo a primeira data
correspondente data de nascimento de uma pessoa e a segunda correspondente a uma
data posterior, e devolve a idade (nmero de anos) dessa pessoa na segunda data.
2.2. EXERCCIOS DE PROGRAMAO 17

> (idade 3 3 1990 28 9 2011)


21
> (idade 3 3 1990 3 2 2011)
20

25. (3) Escreva o procedimento anterior? que recebe como argumentos seis nmeros
inteiros correspondentes a duas datas (um dia, ms, ano para cada data) e devolve
verdadeiro se a primeira data for anterior segunda e falso caso contrrio. No utilize
o if, nem o cond, nem #t nem #f.

> (anterior? 1 12 2010 1 1 2011)


#t
> (anterior? 31 12 2010 1 12 2010)
#f

26. (2) Escreva o procedimento dias-p/-reveillon que recebe como argumentos dois
nmeros inteiros correspondentes a um ms e um ano e que devolve o nmero de dias
desde o dia 1 do ms dado at ao final desse ano.

27. (3) Escreva um procedimento dias-entre-datas que recebe seis nmeros inteiros como
argumentos correspondentes a duas datas (um dia, ms e ano para cada data), sendo
a primeira data anterior segunda e o perodo que decorre entre as datas no superior
a um ano, e devolve o nmero de dias depois da primeira data at segunda data
(inclusive).

(dias-entre-datas 1 12 2010 1 1 2011)


31
(dias-entre-datas 1 12 2010 1 12 2011)
365

28. (3) Escreva o procedimento proximo-29/2 que recebe como argumentos trs nmeros
inteiros correspondentes a uma data (um dia, ms e ano) e devolve o ano da prxima
ocorrncia do dia 29 de Fevereiro depois da data recebida como argumento.
Sugesto: Use o procedimento bissexto? definido na alnea 19.

> (proximo-29/2 29 1 2000)


2000
> (proximo-29/2 29 3 2000)
2004
> (proximo-29/2 29 1 1900)
1904

29. (3) Escreva o procedimento numero-de-29/2s que recebe como argumentos seis n-
meros inteiros correspondentes a duas datas (um dia, ms, ano para cada data), sendo
a primeira data anterior segunda, e devolve o nmero de ocorrncias do dia 29 de
Fevereiro depois da primeira data e at segunda (inclusive).
Sugesto: Use o procedimento proximo-29/2 definido na alnea 28.
18 CAPTULO 2. ABSTRACO PROCEDIMENTAL

30. (3) Escreva o procedimento dias que recebe como argumentos seis nmeros inteiros
correspondentes a duas datas (um dia, ms, ano para cada data), sendo a primeira data
anterior segunda, e devolve o nmero de dias depois da primeira data e at segunda
(inclusive).
Sugesto: Use os procedimentos definidos anteriormente.

2.2.3 Recurso
1. Suponha que em Scheme no existiam as operaes aritmticas +, -, *, /, quotient e
remainder nem os predicados <, >, =, odd? e even? mas que existem os procedimentos
add1, sub1 e zero? que recebem como argumento um inteiro e devolvem, respectiva-
mente, o seu sucessor, o seu antecessor, e o resultado de verificar se o nmero 0.
Neste exerccio apenas poder utilizar estas 3 operaes e outras eventualmente definidas
utilizando estas.

(a) (1) Escreva um procedimento soma que recebe dois nmeros inteiros positivos n
e m, e devolve a soma dos dois.
Sugesto: A soma de dois nmeros n e m pode ser vista como n + 1 + + 1,
m vezes.
> (soma 8 2)
10
(b) (1) Escreva um procedimento multiplica que recebe dois nmeros inteiros posi-
tivos n e m, e devolve a multiplicao dos dois.
Sugesto: A multiplicao de dois nmeros n e m pode ser vista como n + n +
+ n, m vezes.
> (multiplica 8 2)
16
(c) (1) Escreva um procedimento menos que recebe dois nmeros inteiros positivos n
e m, e devolve a diferena dos dois.
Sugesto: Use uma ideia semelhante ao exerccio 1a.
> (menos 8 2)
6
> (menos 2 8)
-6
(d) (2) Escreva um procedimento par? que recebe um nmero inteiro positivo n, e
devolve #t se n for par e #f no caso contrrio.
> (par? 8)
#t
> (par? 5)
#f
(e) (2) Suponha definido um procedimento menor? que recebe dois nmeros inteiros
positivos n e m, e devolve #t se o n for menor do que m e #f no caso contrrio.
2.2. EXERCCIOS DE PROGRAMAO 19

Escreva um procedimento quociente que recebe dois nmeros inteiros positivos n


e m, e devolve o quociente da diviso de n por m. No caso de m ser 0 dever dar um
erro.
Relembre que o quociente da diviso de dois nmeros inteiros positivos n e m o
maior inteiro r tal que r.m n.
Sugesto: Utilize o procedimento menos definido anteriormente.
> (quociente 8 2)
4
> (quociente 10 3)
3

2. (1) Escreva um procedimento somatorio que recebe um nmero inteiro positivo n, e


devolve a soma de todos os nmeros at n.

> (somatorio 3)
6
> (somatorio 6)
21

3. (1) Escreva um procedimento soma-quadrados que recebe um nmero inteiro positivo


n, e devolve a soma do quadrado de todos os nmeros at n.

> (soma-quadrados 3)
14
> (soma-quadrados 5)
55

4. (1) Escreva um procedimento factorial que recebe um nmero inteiro positivo n, e


devolve o factorial desse nmero.

> (factorial 0)
1
> (factorial 5)
120

5. (1) Escreva um procedimento potencia que recebe dois nmeros inteiros positivos b e
n, e devolve a potncia n de b, i.e., bn . Neste exerccio no pode usar o procedimento
expt.

> (potencia 3 2)
9
> (potencia 2 4)
16

6. (2) Um nmero d divisor de n se o resto da diviso de n por d for 0. Escreva um


procedimento numero-divisores que recebe um nmero inteiro positivo n, e devolve o
nmero de divisores de n. No caso de n ser 0 dever devolver 0.
20 CAPTULO 2. ABSTRACO PROCEDIMENTAL

> (numero-divisores 20)


6
> (numero-divisores 13)
2

7. (2) Suponha definido um procedimento primo? que recebe um nmero inteiro positivo
n, e devolve #t se o nmero for primo e #f no caso contrrio.
Escreva um procedimento numero-primos-menores que recebe um nmero inteiro posi-
tivo n, e devolve o nmero de primos menores ou iguais a n.

> (numero-primos-menores 9)
4
> (numero-primos-menores 23)
9

8. (2) Suponha definido um procedimento primo? que recebe um nmero inteiro positivo
n, e devolve #t se o nmero for primo e #f no caso contrrio.
Escreva um procedimento numero-divisores-primos que recebe um nmero inteiro
positivo n, e devolve o nmero de divisores primos de n. No caso de n ser 0 dever
devolver 0.

> (numero-divisores-primos 1)
0
> (numero-divisores-primos 20)
2
> (numero-divisores-primos 30)
3

9. (2) Escreva um procedimento soma-divisores que recebe um nmero inteiro positivo


n, e devolve a soma de todos os divisores de n. No caso de n ser 0 dever devolver 0.

> (soma-divisores 20)


42
> (soma-divisores 13)
14

10. (3) O logaritmo inteiro de um nmero n na base b o maior nmero inteiro e tal que
be n. Escreva um procedimento logaritmo que recebe dois nmeros inteiros positivos
n e b, e devolve o logaritmo inteiro de n na base b. No caso de n ou b serem 0 dever
devolver 0.

> (logaritmo 8 2)
3
> (logaritmo 7 2)
2
2.2. EXERCCIOS DE PROGRAMAO 21

11. (3) A raiz inteira de ndice e de um nmero n o maior nmero inteiro r tal que
re n. Escreva um procedimento raiz que recebe dois nmeros inteiros positivos n e
e, e devolve a raiz inteira de n de ndice e. No caso de e ser 0 dever devolver 0.

> (raiz 8 3)
2
> (raiz 15 2)
3

12. (4) Suponha definido um procedimento kesimo-factor-primo que recebe dois nmeros
inteiros positivos n e k, e devolve o seu k-simo factor primo de n.
Escreva um procedimento kesimo-expoente que recebe dois nmeros inteiros positivos
n e k, e devolve o expoente do k-simo factor primo de n. No caso de n ter menos de k
factores primos ou k ser 0, dever devolver 0.

> (kesimo-expoente 72 1)
3
> (kesimo-expoente 72 2)
2

Nos exerccios que se seguem poder ser til a utilizao dos seguintes procedimentos
sobre nmeros inteiros:
(remainder n m) devolve o resto da diviso de n por m.
(quotient n m) devolve o quociente da diviso de n por m.

13. (3) Escreva um procedimento numero-digitos que recebe um nmero inteiro positivo
n, e devolve o nmero de dgitos de n.

> (numero-digitos 9)
1
> (numero-digitos 1012)
4

14. (3) Escreva um procedimento soma-digitos que recebe um nmero inteiro positivo n,
e devolve a soma de todos os dgitos de n.

> (soma-digitos 9)
9
> (soma-digitos 1012)
4

15. (3) Escreva um procedimento soma-digitos-pares que recebe um nmero inteiro


positivo n, e devolve a soma de todos os dgitos pares de n.

> (soma-digitos-pares 9)
0
> (soma-digitos-pares 1412)
6
22 CAPTULO 2. ABSTRACO PROCEDIMENTAL

16. (4) Escreva um procedimento digitos-impares que recebe um nmero inteiro positivo
n, e devolve o nmero composto apenas pelos dgitos mpares de n ou 0, se n no tiver
dgitos mpares.

> (digitos-impares 94558)


955
> (digitos-impares 2468)
0

17. (4) Escreva um procedimento muda-digito que recebe trs nmeros inteiros positivos
n, k e d, e devolve o inteiro que resulta de substituir o dgito na posio k de n por d.

> (muda-digito 12345 2 8)


12385
> (muda-digito 12345 7 8)
80012345

18. (4) O espelho de um nmero inteiro positivo o resultado de inverter a ordem de todos
os seus algarismos. Escreva um procedimento espelho que recebe um nmero inteiro
positivo n, e devolve o seu espelho.

> (espelho 391)


139
> (espelho 45679)
97654

19. (4) Um nmero binrio bn bn1 . . . b1 b0 pode ser transformado num nmero decimal
usando a seguinte formula ni=0 bi 2i . Escreva um procedimento binario-decimal que
P
recebe um nmero b escrito em binrio e devolve a sua representao decimal.

> (binario-decimal 1001)


9
> (binario-decimal 10000)
16

20. (4) Um nmero decimal d pode ser transformado num nmero binrio bn bn1 . . . b1 b0
atravs da seguinte recorrncia: seja q0 = d e qi = quociente(qi1 , 2) para i > 0, e
bi = resto(qi , 2). Escreva um procedimento decimal-binario que recebe um nmero d
escrito em base 10 e devolve a sua representao binria.

> (decimal-binario 33)


100001
> (decimal-binario 156)
10011100
2.2. EXERCCIOS DE PROGRAMAO 23

2.2.4 Valores aproximados de funes


1. (2) Sabe-se que a seguinte frmula permite calcular uma aproximao da funo seno
at um determinado nmero de termos:
x2 x2 x2
seno(x) = x(1 (1 (1 ( ))))
23 45 67
Defina um procedimento seno que corresponde ao mtodo de clculo anterior. O seu
procedimento dever receber o nmero para o qual se pretende calcular o seno e o nmero
de factores a considerar.
2. (2) A funo arctg pode ser aproximada atravs da frmula

X (1)n z 2n+1 z3 z5 z7
arctg(z) = =z + + ...
2n + 1 3 5 7
n=0

Defina um procedimento que calcule o arctg de acordo com a frmula acima. O seu
procedimento dever receber o nmero z para o qual se quer calcular o arctg bem como
o nmero de termos da expresso a calcular.
3. (3) Suponha que o procedimento sqrt no estava definido em Scheme como um pro-
cedimento primitivo.
A raiz quadrada de um nmero, x, pode ser calculada usando um mtodo de aproxima-

es sucessivas, chamado mtodo de Newton, em que um valor aproximado para x, y,
y+ x
sucessivamente melhorado utilizando a frmula 2 y .

Por exemplo, para calcular 3, poderamos efectuar os seguintes clculos:

Passo Aproximao Nova aproximao


1 3 2
2 2 1.75
3 1.75 1.732142857
4 1.732142857 1.73205081
5 1.73205081 1.732050808
6 1.732050808 1.732050808

Considerando que uma primeira aproximao grosseira para x pode ser x, escreva um
procedimento para calcular a raiz quadrada de um nmero.
4. (3) A constante e um dos nmeros mais importantes em Matemtica, a par com
os elementos neutros da adio (0) e da multiplicao (1), com a constante e com a
unidade imaginria i.
O valor de e corresponde ao nmero real que a soma da seguinte srie infinita

X 1 1 1 1 1
e= = + + + + ...
n! 0! 1! 2! 3!
n=0

Escreva um procedimento para calcular uma aproximao do nmero e, utilizando a


srie apresentada. A condio de paragem deve ser determinada por si e devidamente
justificada.
24 CAPTULO 2. ABSTRACO PROCEDIMENTAL
Captulo 3

Processos gerados por procedimentos

3.1 Exerccios de reviso


1. Explique os seguintes conceitos: procedimento e processo gerado por um procedimento.
2. Quais so as caractersticas de um processo recursivo?
3. Quais so as caractersticas de um processo iterativo linear?
4. Ser que um procedimento recursivo pode gerar um processo iterativo? Justifique a sua
resposta e d um exemplo.
5. Considere a afirmao os procedimentos que geram processos iterativos so sempre me-
lhores que os procedimentos que geram processos recursivos. Comente-a relativamente
aos seguintes aspectos: (a) memria ocupada; (b) tempo gasto; (c) facilidade de escrita
e leitura do programa.
6. Qual o interesse de estudar a ordem de crescimento de um processo? Compare as or-
dens de crescimento (temporal e espacial) entre processos recursivos lineares e iterativos
lineares.
7. Diga o que significa a frase A ordem de crescimento do recurso R(n) (n).
8. Usando a definio da funo que define a ordem de crescimento de um processo,
explique o que significa um processo ter ordem de crescimento polinomial.

3.2 Exerccios de programao


1. (1) Considere o seguinte procedimento

(define (misterio x)
(cond ((= x 0) (newline))
(else (display (remainder x 10))
(misterio (quotient x 10)))))

Qual a funo calculada pelo procedimento misterio?


Sugesto: Siga o processo gerado por este procedimento para alguns inteiros. Depois
admire o poder dos procedimentos recursivos.
26 CAPTULO 3. PROCESSOS GERADOS POR PROCEDIMENTOS

2. (1) Considere a definio do seguinte procedimento em Scheme que recebe inteiros


superiores ou iguais a zero:

(define (misterio?-aux b c)
(cond ((zero? b) #t)
((zero? c) #f)
(else (misterio?-aux (sub1 (sub1 b))
(sub1 (sub1 c))))))

(define (misterio? a)
(misterio?-aux a (sub1 a)))

(a) Explique qual a funo matemtica calculada pelo procedimento misterio?.


(b) O processo gerado pelo procedimento misterio?-aux iterativo ou recursivo? Jus-
tifique a sua resposta.

3. (1) Considere o seguinte procedimento:

(define (misterio-aux n ac)


(if (< n 10)
(+ n (* ac 10))
(misterio-aux (quotient n 10)
(+ (remainder n 10) (* ac 10)))))

(define (misterio n)
(misterio-aux n 0))

(a) Entre os procedimentos apresentados, misterio e misterio-aux, existe algum que


seja um procedimento recursivo? Justifique a sua resposta.
(b) Mostre a evoluo do processo gerado pela avaliao de (misterio 149).
(c) O procedimento misterio gera um processo recursivo ou iterativo? Justifique a
sua resposta.

4. (2) Considere o seguinte procedimento

(define (misterio x n)
(if (= n 0)
0
(+ (* x n) (misterio x (- n 1)))))

(a) Mostre a evoluo do processo gerado pela avaliao de (misterio 2 3).


(b) O procedimento apresentado um procedimento recursivo? Justifique.
(c) O procedimento apresentado gera um processo recursivo ou iterativo? Justifique.
(d) Se o processo gerado era iterativo, transforme o procedimento de forma que gere um
processo recursivo. Se o processo gerado era recursivo, transforme o procedimento,
de forma a que gere um processo iterativo.
3.2. EXERCCIOS DE PROGRAMAO 27

5. (2) Suponha que as operaes de multiplicao e potncia no existiam em Scheme e


que pretende calcular o quadrado de um nmero natural. O quadrado de um nmero
natural pode ser calculado como sendo a soma de todos os nmeros mpares inferiores
ao dobro do nmero. Com efeito:

n 1 + . . . + (2n 1) n2
1 1= 1
2 1+3 = 4
3 1+3+5 = 9
4 1+3+5+7 = 16
5 1+3+5+7+9 = 25
6 1+3+5+7+9+11 = 36
... ... ...

Note que o dobro de um nmero tambm no pode ser calculado recorrendo operao
de multiplicao.
Escreva dois procedimentos que calculam o quadrado de um nmero natural utilizando
o mtodo descrito.

(a) Um procedimento que d origem a um processo recursivo linear.


(b) Um procedimento que d origem a um processo iterativo linear.

6. (2) Defina um procedimento recursivo que recebe trs argumentos a, b e n e que devolve
o valor de somar n vezes a a b, i.e., b + a + a + + a, n vezes.

(a) Gerando um processo recursivo.


(b) Gerando um processo iterativo.

7. Suponha que em Scheme no existiam as operaes aritmticas +, -, quotient, * e /


nem os predicados <, > e = mas que existem os procedimentos add1, sub1 e zero? que
recebem como argumento um inteiro e devolvem, respectivamente, o seu sucessor, o seu
antecessor, e o resultado de verificar se o nmero 0.
Neste exerccio apenas poder utilizar estas 3 operaes e outras eventualmente definidas
utilizando estas.

(a) (1) (Seco 2.2.3, Ex 1a) Escreva um procedimento soma, que gere um processo
iterativo, e que recebe dois nmeros inteiros positivos n e m, e devolve a soma dos
dois.
Sugesto: A soma de dois nmeros n e m pode ser vista como n + 1 + + 1,
m vezes.
> (soma 8 2)
10
(b) (1) (Seco 2.2.3, Ex 1b) Escreva um procedimento multiplica, que gere um
processo iterativo, e que recebe dois nmeros inteiros positivos n e m, e devolve a
multiplicao dos dois.
Sugesto: A multiplicao de dois nmeros n e m pode ser vista como n + n +
+ n, m vezes.
28 CAPTULO 3. PROCESSOS GERADOS POR PROCEDIMENTOS

> (multiplica 8 2)
16
(c) (1) (Seco 2.2.3, Ex 1c) Escreva um procedimento menos, que gere um processo
iterativo, e que recebe dois nmeros inteiros positivos n e m, e devolve a diferena
dos dois.
Sugesto: Use uma ideia semelhante ao exerccio 7a.
> (menos 8 2)
6
> (menos 2 8)
-6
(d) (2) (Seco 2.2.3, Ex 1d) Escreva um procedimento par?, que gere um processo
iterativo, e que recebe um nmero inteiro positivo n, e devolve verdadeiro se n for
par e falso no caso contrrio.
> (par? 8)
#t
> (par? 5)
#f
(e) (1) Escreva um procedimento igual?, e que gere um processo iterativo, que recebe
dois nmeros inteiros positivos n e m, e devolve verdadeiro se o n for igual a m e
falso no caso contrrio.
> (igual? 8 2)
#f
> (igual? 8 8)
#t
> (igual? 2 8)
#f
(f) (1) Escreva um procedimento menor?, e que gere um processo iterativo, que recebe
dois nmeros inteiros positivos n e m, e devolve verdadeiro se o n for menor do que
m e falso no caso contrrio.
> (menor? 8 2)
#f
> (menor? 8 8)
#f
> (menor? 2 8)
#t
(g) (2) (Seco 2.2.3, Ex 1e) Escreva um procedimento quociente, que gere um pro-
cesso iterativo, e que recebe dois nmeros inteiros positivos n e m, e devolve o
quociente da diviso de n por m. No caso de m ser 0 dever devolver 0.
Relembre que o quociente da diviso de dois nmeros inteiros positivos n e m o
maior inteiro r tal que r.m n.
Sugesto: Utilize os procedimentos menos e menor? definidos anteriormente.
3.2. EXERCCIOS DE PROGRAMAO 29

> (quociente 8 2)
4
> (quociente 10 3)
3
(h) (2) Escreva um procedimento resto, que gere um processo iterativo, e que recebe
dois nmeros inteiros positivos n e m, e devolve o resto da diviso de n por m. No
caso de m ser 0 dever devolver n.
> (resto 8 2)
0
> (resto 10 3)
1
(i) (2) Escreva um procedimento simetrico, que gere um processo iterativo, e que
recebe um nmero inteiro n, e devolve o simetrico de n.
> (simetrico 8)
-8
> (simetrico -3)
3

8. (1) (Seco 2.2.3, Ex 3) Escreva um procedimento soma-quadrados, que gere um pro-


cesso iterativo, e que recebe um nmero inteiro positivo n, e devolve a soma do quadrado
de todos os nmeros at n.

> (soma-quadrados 3)
14
> (soma-quadrados 5)
55

9. (1) (Seco 2.2.3, Ex 5) Escreva um procedimento potencia, que gere um processo


iterativo, e que recebe dois nmeros inteiros positivos b e n, e devolve a potncia n de b,
i.e., bn .

> (potencia 3 2)
9
> (potencia 2 4)
16

10. (2) Um nmero n quadrado perfeito se existir um m tal que m2 = n. Escreva um


procedimento quadrado-perfeito?, que gere um processo iterativo, e que recebe um
nmero n, e devolve verdadeiro se n for um quadrado perfeito e falso no caso contrrio.

> (quadrado-perfeito? 4)
#t
> (quadrado-perfeito? 8)
#f
30 CAPTULO 3. PROCESSOS GERADOS POR PROCEDIMENTOS

11. (2) Um nmero n diz-se primo se os seus nicos divisores so o 1 e o prprio n. O


nmero 1 no primo. Um modo, pouco eficiente, de determinar se um dado inteiro
primo corresponde a dividi-lo sucessivamente por todos os inteiros menores que ele.
Escreva um procedimento primo?, que gere um processo iterativo, e que recebe um
nmero inteiro positivo n, e usando o mtodo acima devolve verdadeiro se o nmero for
primo e falso no caso contrrio.

> (primo? 53)


#t
> (primo? 21)
#f

12. (3) Um nmero livre de quadrados se no for divisvel por nenhum quadrado perfeito
para alm de 1. Escreva um procedimento livre-quadrados?, que gere um processo
iterativo, e que recebe um nmero n, e devolve verdadeiro se n for livre de quadrados e
falso no caso contrrio.

> (livre-quadrados? 4)
#f
> (livre-quadrados? 50)
#f
> (livre-quadrados? 70)
#t

13. (3) Um nmero n diz-se poderoso se para cada primo p, se p divisor de n ento p2
tambm divisor de n. Escreva um procedimento poderoso?, que gere um processo
iterativo, e que recebe um nmero inteiro positivo n, e devolve verdadeiro se o nmero
for poderoso e falso no caso contrrio.

> (poderoso? 100)


#t
> (poderoso? 36)
#t
> (poderoso? 75)
#f
> (poderoso? 2)
#f

14. (2) (Seco 2.2.3, Ex 6) Um nmero d divisor de n se o resto da diviso de n por d


for 0. Escreva um procedimento numero-divisores, que gere um processo iterativo, e
que recebe um nmero inteiro positivo n, e devolve o nmero de divisores de n. No caso
de n ser 0 dever devolver 0.

> (numero-divisores 20)


6
> (numero-divisores 13)
2
3.2. EXERCCIOS DE PROGRAMAO 31

15. (2) (Seco 2.2.3, Ex 9) Escreva um procedimento soma-divisores, que gere um pro-
cesso iterativo, e que recebe um nmero inteiro positivo n, e devolve a soma de todos os
divisores de n. No caso de n ser 0 dever devolver 0.

> (soma-divisores 20)


42
> (soma-divisores 13)
14

16. (3) (Seco 2.2.3, Ex 11) A raiz inteira de ndice e de um nmero n o maior nmero
inteiro r tal que re n. Escreva um procedimento raiz, que gere um processo iterativo,
e que recebe dois nmeros inteiros positivos n e e, e devolve a raiz inteira de n de ndice
e. No caso de e ser 0 dever devolver 0.

> (raiz 8 3)
2
> (raiz 15 2)
3

17. (3) Um nmero n diz-se triangular se n = 1 + 2 + + (m 1) + m para algum m.


Escreva um procedimento triangular?, que gere um processo iterativo, e que recebe um
nmero inteiro positivo n, e devolve verdadeiro se o nmero for triangular e falso no caso
contrrio. No caso de n ser 0 dever devolver falso.

> (triangular? 6)
#t
> (triangular? 8)
#f

18. (3) Dois nmeros n e m dizem-se primos entre si se no tm nenhum divisor em comum
excepo do 1. Escreva um procedimento primos-entre-si?, que gere um processo
iterativo, e que recebe dois nmeros inteiros positivos n e m, e devolve verdadeiro se os
nmeros forem primos entre si e falso no caso contrrio. No caso de n ou m serem 0
dever devolver falso.

> (primos-entre-si? 4 10)


#f
> (primos-entre-si? 21 10)
#t

19. (3) Um nmero n diz-se um divisor fraco de m se todos os factores primos de n


tambm so factores primos de m. Escreva um procedimento divisor-fraco?, que
gere um processo iterativo, e que recebe dois nmeros inteiros positivos n e m, e devolve
verdadeiro se n for um divisor fraco de m e falso no caso contrrio. No caso de n ou m
serem 0 dever devolver falso.
32 CAPTULO 3. PROCESSOS GERADOS POR PROCEDIMENTOS

> (divisor-fraco? 4 10)


#t
> (divisor-fraco? 10 4)
#f
> (divisor-fraco? 6 10)
#f

20. (4) O mximo divisor comum de dois nmeros n e m o maior inteiro x tal que x
divisor de n e m. Escreva um procedimento mdc, que gere um processo iterativo, e que
recebe dois nmeros inteiros positivos n e m, e devolve o mximo divisor comum dos dois
nmeros. No caso de n e m serem ambos 0 dever devolver 0. Se apenas um deles for 0
dever devolver o outro.

> (mdc 3 0)
3
> (mdc 12 20)
4
> (mdc 10 20)
10

21. (4) O mnimo mltiplo comum de dois nmeros n e m o menor inteiro x tal que x
divisvel por n e m. Escreva um procedimento mmc, que gere um processo iterativo, e
que recebe dois nmeros inteiros positivos n e m, e devolve o mnimo mltiplo comum
dos dois nmeros. No caso de n ou m serem 0 dever devolver 0.

> (mmc 4 6)
12
> (mmc 12 5)
60

22. (3) Um nmero n o n-simo primo se for primo e existirem n 1 nmeros primos
menores que ele. Escreva um procedimento nesimo-primo, que gere um processo itera-
tivo, e que recebe um nmero inteiro positivo n, e devolve o n-simo nmero primo. No
caso de n ser 0 dever devolver 0.

> (nesimo-primo 1)
2
> (nesimo-primo 10)
29

23. (3) Um nmero p primo de Mersenne se p primo e 2p 1 tambm primo. Um


nmero n o n-simo primo de Mersenne se existirem n1 primos de Mersenne menores
que n. Os primeiros 10 primos de Mersenne so 2, 3, 5, 7, 13, 17, 19, 31, 61, 89.
Escreva um procedimento nesimo-primo-mersenne, que gere um processo iterativo, e
que recebe um nmero n, e devolve o n-simo primo de Mersenne.
3.2. EXERCCIOS DE PROGRAMAO 33

> (nesimo-primo-mersenne 3)
5
> (nesimo-primo-mersenne 9)
61

24. (3) Um nmero d o k-simo divisor de n se for divisor de n e existirem k1 divisores de


n menores que d. Escreva um procedimento k-divisor, que gere um processo iterativo,
e que recebe dois nmeros inteiros positivos n e k, e devolve o k-simo divisor de n. No
caso de n ser 0, ou k ser 0, ou n ter menos de k divisores dever devolver 0.

> (kesimo-divisor 20 3)
4
> (kesimo-divisor 20 6)
20
> (kesimo-divisor 20 7)
0

25. (3) Um nmero p o k-simo factor primo de n se p primo e existem k 1 factores


primos de n menores que p. Escreva um procedimento kesimo-factor-primo, que gere
um processo iterativo, e que recebe dois nmeros inteiros positivos n e k, e devolve o
seu k-simo factor primo de n. No caso de n ter menos de k factores primos ou k ser 0,
dever devolver 0.

> (kesimo-factor-primo 3 1)
3
> (kesimo-factor-primo 3 2)
0
> (kesimo-factor-primo 60 3)
5

26. (4) (Seco 2.2.3, Ex 12) Escreva um procedimento kesimo-expoente, que gere um
processo iterativo, e que recebe dois nmeros inteiros positivos n e k, e devolve o expoente
do k-simo factor primo de n. No caso de n ter menos de k factores primos ou k ser 0,
dever devolver 0.

> (kesimo-expoente 72 1)
3
> (kesimo-expoente 72 2)
2

Nos exerccios que se seguem poder ser til a utilizao dos seguintes procedimentos
sobre nmeros inteiros:
(remainder n m) devolve o resto da diviso de n por m.
(quotient n m) devolve o quociente da diviso de n por m.

27. (3) (Seco 2.2.3, Ex 13) Escreva um procedimento numero-digitos, que gere um
processo iterativo, e que recebe um nmero inteiro positivo n, e devolve o nmero de
dgitos de n.
34 CAPTULO 3. PROCESSOS GERADOS POR PROCEDIMENTOS

> (numero-digitos 9)
1
> (numero-digitos 1012)
4

28. (3) (Seco 2.2.3, Ex 14) Escreva um procedimento soma-digitos, que gere um pro-
cesso iterativo, e que recebe um nmero inteiro positivo n, e devolve a soma de todos os
dgitos de n.

> (soma-digitos 9)
9
> (soma-digitos 1012)
4

29. (3) Escreva um procedimento existe-digito?, que gere um processo iterativo, e que
recebe um nmero inteiro positivo n e um dgito d, e devolve verdadeiro se o dgito d
ocorrer em n e falso no caso contrrio.

> (existe-digito? 234 3)


#t
> (existe-digito? 538 7)
#f

30. (4) (Seco 2.2.3, Ex 16) Escreva um procedimento digitos-impares, que gere um
processo iterativo, e que recebe um nmero inteiro positivo n, e devolve o nmero com-
posto apenas pelos dgitos mpares de n.

> (digitos-impares 94558)


955
> (digitos-impares 2468)
0

31. (3) O dgito de posio k de um nmero n o dgito na k-sima posio de n a partir do


dgito das unidades. Escreva um procedimento posicao, que gere um processo iterativo,
e que recebe dois nmeros inteiros positivos n e k, e devolve o dgito na posicao k de n.
No caso de n ter menos de k dgitos ou k ser 0, dever devolver 0.

> (posicao 12345 2)


4
> (posicao 12345 7)
0

32. (3) Um nmero capicua se se l igualmente da esquerda para a direita e vice-versa.


Escreva um procedimento capicua?, que gere um processo iterativo, e que recebe um
nmero inteiro positivo n, e devolve verdadeiro se o nmero for uma capicua e falso no
caso contrrio.
Sugesto: Use o procedimento posicao definido na alnea 31
3.2. EXERCCIOS DE PROGRAMAO 35

> (capicua? 12321)


#t
> (capicua? 1221)
#t
> (capicua? 123210)
#f

33. (4) (Seco 2.2.3, Ex 17) Escreva um procedimento muda-digito, que gere um processo
iterativo, e que recebe trs nmeros inteiros positivos n, k e d, e devolve o inteiro que
resulta de substituir o dgito na posio k de n por d.

> (muda-digito 12345 2 8)


12385
> (muda-digito 12345 7 8)
80012345

34. (4) (Seco 2.2.3, Ex 18) O espelho de um nmero inteiro positivo o resultado de
inverter a ordem de todos os seus algarismos. Escreva um procedimento espelho, que
gere um processo iterativo, e que recebe um nmero inteiro positivo n, e devolve o seu
espelho.

> (espelho 391)


139
> (espelho 45679)
97654

35. (1) Usando o procedimento espelho definido acima, reescreva de novo o procedimento
capicua? definido na alnea 32.

36. (4) (Seco 2.2.3, Ex 20) Um nmero decimal d pode ser transformado num nmero bi-
nrio bn bn1 . . . b1 b0 atravs da seguinte recorrncia: seja q0 = d e qi = quociente(qi1 , 2)
para i > 0, e bi = resto(qi , 2). Escreva um procedimento decimal-binario, que gere
um processo iterativo, e que recebe um nmero d escrito em base 10 e devolve a sua
representao binria.

> (decimal-binario 33)


100001
> (decimal-binario 156)
10011100
36 CAPTULO 3. PROCESSOS GERADOS POR PROCEDIMENTOS
Captulo 4

Estruturao de Procedimentos

4.1 Exerccios de reviso


1. Diga o que entende por linguagem estruturada em blocos. Descreva a regra associada a
esta estrutura, e diga qual a sua importncia.
2. O que entende pelo domnio de um nome?

4.2 Exerccios de programao


4.2.1 Estrutura de Blocos
1. (1) Considere as seguintes alternativas para definir um procedimento que calcula a
funo factorial.
Alternativa 1:

(define (factorial n)
(if (>= n 0)
(fact-aux n)
(error "factorial: argumento negativo")))

(define (fact-aux n)
(if (= n 0)
1
(* n (fact-aux (- n 1)))))

Alternativa 2:

(define (factorial n)
(define (fact-aux n)
(if (= n 0)
1
(* n (fact-aux (- n 1)))))
(if (>= n 0)
(fact-aux n)
(error "factorial: argumento negativo")))
38 CAPTULO 4. ESTRUTURAO DE PROCEDIMENTOS

(a) Compare estas duas alternativas quanto garantia de que o factorial no calculado
com valores indevidos.
Sugesto: Ser que se pode avaliar directamente (fact-aux -1)?
(b) Como se chama a estrutura definida pela alternativa 2? Qual a sua vantagem?

2. (1) Considere o seguinte procedimento que calcula m! n! (m > n), recorrendo estrutura
de blocos. Identifique as variveis locais e no locais para cada um dos procedimentos.

(define (quociente-de-factoriais m n)
(define (iter m res)
(if (= m n)
res
(iter (- m 1) (* m res))))
(iter m 1))

3. (1) (Seco 2.2.3, Ex 2) Recorrendo estrutura de blocos, escreva um procedimento


somatorio que recebe um nmero inteiro positivo n, e devolve a soma de todos os
nmeros at n. O seu procedimento deve gerar um processo iterativo.

> (somatorio 3)
6
> (somatorio 6)
21

4. (1) (Seco 2.2.3, Ex 4) Recorrendo estrutura de blocos, escreva um procedimento


factorial que recebe um nmero inteiro positivo n, e devolve o factorial desse nmero.
O seu procedimento deve gerar um processo iterativo.

> (factorial 0)
1
> (factorial 5)
120

5. (2) (Seco 2.2.3, Ex 7) Recorrendo estrutura de blocos, escreva um procedimento


numero-primos-menores que recebe um nmero inteiro positivo n, e devolve o nmero
de primos menores ou iguais a n. O seu procedimento deve gerar um processo iterativo.
Sugesto: Utilize o procedimento primo? definido na alnea 11 da Seco 3.2.

> (numero-primos-menores 9)
4
> (numero-primos-menores 23)
9

6. (2) (Seco 2.2.3, Ex 8) Recorrendo estrutura de blocos, escreva um procedimento


numero-divisores-primos que recebe um nmero inteiro positivo n, e devolve o nmero
de divisores primos de n. No caso de n ser 0 dever devolver 0. O seu procedimento
deve gerar um processo iterativo.
Sugesto: Utilize o procedimento primo? definido na alnea 11 da Seco 3.2.
4.2. EXERCCIOS DE PROGRAMAO 39

> (numero-divisores-primos 1)
0
> (numero-divisores-primos 20)
2
> (numero-divisores-primos 30)
3

7. (3) (Seco 2.2.3, Ex 10) O logaritmo inteiro de um nmero n na base b o maior


nmero inteiro e tal que be n. Recorrendo estrutura de blocos, escreva um procedi-
mento logaritmo que recebe dois nmeros inteiros positivos n e b, e devolve o logaritmo
inteiro de n na base b. No caso de n ou b serem 0 dever devolver 0. O seu procedimento
deve gerar um processo iterativo.

> (logaritmo 8 2)
3
> (logaritmo 7 2)
2

8. (3) (Seco 2.2.3, Ex 15) Recorrendo estrutura de blocos, escreva um procedimento


soma-digitos-pares que recebe um nmero inteiro positivo n, e devolve a soma de
todos os dgitos pares de n. O seu procedimento deve gerar um processo iterativo.

> (soma-digitos-pares 9)
0
> (soma-digitos-pares 1412)
6

9. (4) (Seco 2.2.3, Ex 19) Um nmero binrio bn bn1 . . . b1 b0 pode ser transformado
num nmero decimal usando a seguinte formula ni=0 bi 2i . Recorrendo estrutura de
P
blocos, escreva um procedimento binario-decimal que recebe um nmero b escrito
em binrio e devolve a sua representao decimal. O seu procedimento deve gerar um
processo iterativo.

> (binario-decimal 1001)


9
> (binario-decimal 10000)
16

4.2.2 Utilizao de Nomes Locais


1. Em relao s seguintes expresses utilizando o let, avalie o valor da expresso e
transforme-a numa expresso equivalente utilizando o lambda.

(a) (1)
(let ((x 5)
(y 3))
(* x y))
40 CAPTULO 4. ESTRUTURAO DE PROCEDIMENTOS

(b) (1)
(let ((x 4)
(y 3))
(let ((z (* x y)))
(+ z x)))
(c) (2)
(let ((x 5))
(let ((x 3)
(y (* x 2)))
(+ x y)))
(d) (2)
(let ((x 5)
(y 12))
(+ x (let ((x (+ x y)))
(+ x 3))))
2. (2) Suponha que a tem o valor 5 no ambiente global. Diga qual o resultado de avaliar
a seguinte expresso:

(let ((a 3)
(b (* a 4)))
(+ a b))

3. (2) Considere as seguintes expresses. So equivalentes? Justifique.


(let ((x 8)) (let* ((x 8)
(let ((x 5) (x 5)
(y (+ x 4))) (y (+ x 4)))
(+ x y))) (+ x y))
4. Para cada uma das seguintes combinaes envolvendo uma expresso lambda, calcule
o seu valor e transforme-a numa expresso equivalente utilizando o let.
(a) (1)
((lambda (x y)
(+ (* 3 x)
y))
2
3)
(b) (1)
((lambda (x)
((lambda (y)
((lambda (z) (* y z))
(+ x y)))
2))
5)
4.2. EXERCCIOS DE PROGRAMAO 41

(c) (1)
((lambda (x)
((lambda (y) (+ (* 2 y) x))
(+ x 3)))
5)
(d) (2)
((lambda (x y)
((lambda (x) (+ (* 2 x)
y))
(+ x y)))
6
2)
(e) (2)
((lambda (x y)
(+ x y ((lambda (z) (* 2 z))
(+ y 1))))
5
2)

5. Para cada uma das seguintes sries, escreva um programa em Scheme que calcula o valor
aproximado da srie. O seu programa deve apresentar uma estrutura de blocos e deve
evitar clculos repetidos. Pode utilizar os procedimentos potencia e factorial sem os
definir.

(a) (2)

1 1 1 1 X 1
1+ + + + + ... =
2 4 8 16 2n
n=0

(b) (2)

1 1 1 1 X 1
1 + + + ... = (1)n+1 = ln(2)
2 3 4 5 n
n=1

(c) (2)

X xn
= ex
n!
n=1

(d) (2)

x2 x4 X x2n2
1 + ... = (1)n+1 = cos(x)
2! 4! (2n 2)!
n=1
42 CAPTULO 4. ESTRUTURAO DE PROCEDIMENTOS
Captulo 5

Abstraco de dados

5.1 Exerccios de reviso


1. Diga o que um tipo abstracto de informao.

2. Diga qual a diferena entre tipos de informao elementares e tipos de informao


estruturados.

3. Explique em que consiste a abstraco de dados, usando os termos barreiras de abstrac-


o, encapsulao da informao e anonimato da representao.

4. Explique quais so as vantagens da abstraco de dados.

5. Compare a abstraco de dados com a abstraco procedimental.

6. Justifique a seguinte afirmao a abstraco de dados aumenta o poder expressivo da


nossa linguagem de programao.

7. Quais so os quatro passos a seguir na definio de um tipo abstracto de informao?


Explique em que consiste cada um deles.

8. Diga o que so operaes bsicas de um tipo abstracto de informao e quais os grupos


em que estas so divididas.

9. Explique o que so as barreiras de abstraco criadas por um tipo de informao e quais


os inconvenientes de no as respeitar.

10. Apresente a metodologia dos tipos abstractos de informao e explique porque que
esta metodologia garante a abstraco de dados.

11. Diga o que o anonimato da representao e qual a sua importncia.

12. Na criao de um tipo abstracto de informao, h dois tipos de representao a consi-


derar. Diga quais so e descreva cada um deles.

13. Diga o que uma rvore binria e quais so as suas operaes bsicas, classificando-as
de acordo com os vrios grupos de operaes.

43
44 CAPTULO 5. ABSTRACO DE DADOS

5.2 Exerccios de programao


5.2.1 Caixas e ponteiros
1. (1) Considere a seguinte estrutura de pares usando a notao de caixas e pontei-
ros(correspondente varivel Estr):

Para cada uma das seguintes expresses escreva o seu valor (o qual pode ser um nmero
inteiro, uma estrutura de pares ou pode originar um erro). No caso de a expresso
originar um erro explique a razo do erro.

(a) (car Estr)


(b) (car (car (cdr Estr)))
(c) (cdr (cdr (cdr Estr)))

2. (1) Represente as seguintes estruturas, usando a notao de caixas e ponteiros:

(a) (1 . 2)
(b) (1 . ("bom dia". 3))
(c) (1 . (2 . (3 . 4)))
(d) ((1 . 2) . ((3 . (4 . 5)) . (7 . 8)))

5.2.2 Tipo tempo


Suponha que desejava criar o tipo tempo em Scheme. Suponha que o tempo caracterizado
por um certo nmero de horas (um inteiro no negativo), minutos (um inteiro entre 0 e 59) e
segundos (um inteiro entre 0 e 59).

1. (2) Especifique as operaes bsicas para o tipo tempo.

2. (1) Escolha uma representao interna para o tipo tempo usando pares.

3. (2) Escreva em Scheme as operaes bsicas, de acordo com a representao escolhida.


5.2. EXERCCIOS DE PROGRAMAO 45

4. (1) Supondo que a representao externa para os elementos do tipo tempo h : mm : ss


(em que h um inteiro positivo que representa as horas, mm so dois dgitos que
identificam os minutos e ss so dois dgitos que identificam os segundos) escreva o
transformador de sada escreve-tempo para o tipo tempo. Por exemplo,

> (escreve-tempo (faz-tempo 9 2 34))


9:02:34

5. (1) Escreva o procedimento diferenca-segundos que calcula o nmero de segundos


entre dois instantes de tempo. Este procedimento apenas deve produzir um valor se o
segundo tempo for maior do que o primeiro, gerando uma mensagem de erro se essa
condio no se verificar.

> (diferenca-segundos (faz-tempo 10 2 34) (faz-tempo 11 2 34))


3600

6. (1) Escreva o procedimento diferenca-tempo que calcula a diferena entre dois ins-
tantes de tempo devolvendo o valor em termos de horas, minutos e segundos. Este
procedimento apenas deve produzir um valor se o segundo tempo for maior do que o
primeiro, gerando uma mensagem de erro se essa condio no se verificar.

> (escreve-tempo (diferenca-tempo (faz-tempo 10 2 34) (faz-tempo 11 4 39)))


1:02:05

7. (2) Escreva o procedimento soma-tempos que calcula o tempo resultante da soma entre
dois instantes de tempo.

> (escreve-tempo (soma-tempos (faz-tempo 1 45 30) (faz-tempo 2 20 40)))


4:06:10

8. (2) Suponha agora que pretende representar os elementos do tipo tempo atravs de
inteiros positivos com a forma hmmss, em que h um inteiro no negativo que representa
o nmero de horas, mm e ss so dois inteiros entre 0 e 59 cada um e que representam,
respectivamente, os minutos e os segundos do tempo.
Escreva em Scheme as operaes bsicas, de acordo com esta nova representao.

9. (1) Seria possvel utilizar as operaes definidas nos exerccios anteriores, 47, usando
esta nova representao? Justifique.

5.2.3 Tipo data


Suponha que desejava criar o tipo data em Scheme. Suponha que uma data caracterizada
por um dia (um inteiro entre 1 e 31), um ms (um inteiro entre 1 e 12) e um ano. Para cada
data, deve ser respeitado o limite de dias de cada ms, incluindo o caso de Fevereiro nos anos
bissextos.

1. (1) Especifique as operaes bsicas para o tipo data.


46 CAPTULO 5. ABSTRACO DE DADOS

2. (2) Escolha uma representao interna para o tipo data usando pares.

3. (1) Escreva em Scheme as operaes bsicas, de acordo com a representao escolhida.

4. (1) Supondo que a representao externa para um elemento do tipo data d/m/a (em
que d representa o dia, m o ms e a o ano) escreva o transformador de sada para o tipo
data. Por exemplo,

> (escreve-data (faz-data 5 9 2011))


5/9/2011

5. (2) Tendo em conta as operaes bsicas do tipo data, defina um procedimento anterior?
que recebe como argumentos duas datas e tem o valor verdadeiro se a primeira data for
anterior segunda e falso em caso contrrio.

> (anterior? (faz-data 2 1 2003) (faz-data 2 1 2005))


#t

6. (2) Tendo em conta as operaes bsicas do tipo data, defina um procedimento idade
que recebe como argumentos a data de nascimento de uma pessoa e outra data posterior
e devolve a idade da pessoa na segunda data.

> (idade (faz-data 2 1 2003) (faz-data 2 1 2005))


2
> (idade (faz-data 2 1 2003) (faz-data 2 3 2006))
3

5.2.4 Complexos
Suponha que desejava criar o tipo nmero complexo em Scheme. Um nmero complexo
um nmero que constitudo por uma parte real e por uma parte imaginria. Um nmero
complexo pode ser escrito sob a forma a + bi, em que a e b so nmeros reais e i representa
a unidade imaginria. Esta tem a propriedade i2 = 1. Os reais a e b so chamados,
respectivamente, a parte real e a parte imaginria de a + bi. Os nmeros complexos podem ser
representados geometricamente no plano complexo (representao rectangular ou cartesiana),
representando-se a parte real, a, no eixo horizontal e a parte imaginria, b, no eixo vertical.

1. Defina as operaes bsicas para o tipo nmero complexo.

2. Escolha uma representao para nmeros complexos baseada em pares.

3. Com base na representao escolhida, implemente as operaes bsicas para nmeros


complexos.

4. Com base na representao escolhida, escreva o transformador de sada para nmeros


complexos.
5.2. EXERCCIOS DE PROGRAMAO 47

5. Um nmero complexo diz-se um imaginrio puro se a sua parte real for zero. Usando os
resultados das alneas anteriores, e a abstraco adequada, escreva um procedimento que
recebe um nmero complexo e que decide se este um imaginrio puro. Por exemplo:

> (im-puro? (cmp 2 3))


#f
> (im-puro? (cmp 0 3))
#t

6. Considere as seguintes operaes definidas sobre nmeros complexos:

(a + bi) + (c + di) = (a + c) + (b + d)i

(a + bi)(c + di) = (ac bd) + (ad + bc)i

Usando os resultados das alneas anteriores, e a abstraco adequada, escreva procedi-


mentos que somam e multiplicam nmeros complexos. Por exemplo:

> (escreve-cmp (cmp+ (cmp 2 3)(cmp 4 5)))


6+8i
> (escreve-cmp (cmp* (cmp 2 3)(cmp 4 5)))
-7+22i

7. Considere a seguinte representao alternativa para nmeros complexos: <[a + bi] =


(cons "complexo"(cons a b)).

(a) Escreva as operaes bsicas e o transformador de sada com base nesta represen-
tao.
(b) Quais as alteraes a fazer nas operaes imaginrio puro e soma e multiplica com-
plexos como consequncia da alterao da representao. Justifique a sua resposta.

8. Suponha que por questes de segurana a representao de nmeros complexos deveria


ser encriptada. Supondo que existem funes de codificao (code que recebe um nmero
real devolve a sua imagem encriptada) e de descodificao (decode, que recebe uma
imagem encriptada e devolve o real correspondente) e de teste de imagem encriptada
(code?), defina uma representao correspondente aos nmeros complexos encriptados
e com base nessa representao volte a escrever as operaes bsicas para nmeros
complexos.

9. Uma representao alternativa para o nmero complexo a + bi, conhecida por repre-
sentao polar ou trignomtrica (Figura
5.1), utiliza a distncia do nmero complexo
origem do referencial, o mdulo = a2 + b2 , e o ngulo que a linha que liga a origem
do referencial ao ponto que representa o nmero complexo faz com a parte positiva do
48 CAPTULO 5. ABSTRACO DE DADOS


a x

Figura 5.1: Representao polar de nmeros complexos.

eixo 0~x. Para o complexo a + bi, o valor de dado por:




arctg( ab ) se a > 0




b
arctg( a ) +


se a < 0 e b 0



arctg( ab )

se a < 0 e b < 0


=

se a = 0 e b > 0


2





2




se a = 0 e b < 0




indef inido se a = 0 e b = 0

Com base nesta representao, podemos escrever:

a + bi = (cos() + sen()i)

Escolha uma representao para nmeros complexos em notao polar e escreva as ope-
raes bsicas para complexos com base nessa representao.
10. Escreva as operaes rect->polar e polar->rect que transformas as representaes
rectangular em polar e vice-versa.

5.2.5 Listas
1. (1) Escreva um procedimento ultimo que recebe uma lista no vazia, e devolve o
ltimo elemento da lista.

> (ultimo (4 5 6))


6
> (ultimo (1))
1

2. (1) Escreva um procedimento produto-lista que recebe uma lista de nmeros intei-
ros, e devolve o produto de todos os elementos da lista. Considere que o produto dos
elementos de uma lista vazia tem o valor 1.Exemplo,
5.2. EXERCCIOS DE PROGRAMAO 49

> (produto-lista (4 5 6))


120
> (produto-lista ())
1

3. (1) Escreva um procedimento conta-pares que recebe uma lista de nmeros inteiros,
e devolve o nmero de elementos pares na lista.

> (conta-pares (4 5 6))


2
> (conta-pares (3 5 7))
0

4. (1) Escreva um procedimento conta-menores que recebe uma lista de nmeros inteiros
lst e um nmero inteiro n, e devolve o nmero de elementos da lista lst menores que
n.

> (conta-menores (4 5 6) 4)
0
> (conta-menores (3 5 7) 6)
2

5. (1) Escreva um procedimento numero-ocorrencias que recebe uma lista de nmeros


inteiros e um nmero inteiro n, e devolve o nmero de vezes que no ocorre na lista.

> (numero-ocorrencias (4 5 6) 5)
1
> (numero-ocorrencias (3 5 7) 2)
0

6. (2) Escreva um procedimento todos-pares? que recebe uma lista de nmeros inteiros,
e devolve verdadeiro se a lista for constituda exclusivamente por nmeros pares e falso
no caso contrrio.

> (todos-pares? (4 5 6))


#f
> (todos-pares? (4 4 6))
#t

7. (2) Escreva um procedimento ocorre-lista? que recebe uma lista de nmeros inteiros
e um nmero inteiro n, e devolve verdadeiro se o nmero n ocorrer na lista e falso no
caso contrrio.

> (ocorre-lista? (3 2 4) 3)
#t
> (ocorre-lista? (3 2 4) 1)
#f
50 CAPTULO 5. ABSTRACO DE DADOS

8. (3) Escreva um procedimento maximo-lista que recebe uma lista no vazia de nmeros
inteiros, e devolve o maior elemento da lista.

> (maximo-lista (4 5 6))


6
> (maximo-lista (7 3 6))
7

9. (2) Escreva um procedimento quadrados-lista que recebe uma lista de nmeros intei-
ros e devolve a lista que resulta de elevar todos os nmeros da lista original ao quadrado.

> (quadrados-lista (3 2 4))


(9 4 16)

10. (2) Escreva um procedimento substitui que recebe uma lista de nmeros inteiros lst,
um nmero inteiro v (velho) e um nmero inteiro n (novo), e devolve a lista que resulta
de substituir em lst todas as ocorrncias de v por n.

> (substitui (4 3 2 4) 4 5)
(5 3 2 5)

11. (2) Escreva um procedimento insere-no-fim que recebe uma lista lst e um nmero
n, e devolve a lista que resulta de inserir o elemento n no final da lista lst.

> (insere-no-fim 3 (3 2 4))


(3 2 4 3)
> (insere-no-fim 3 ())
(3)

12. (2) Escreva um procedimento remove-ultimo que recebe uma lista no vazia, e devolve
a lista que resulta de remover o ltimo elemento da lista.

> (remove-ultimo (3 2 4))


(3 2)
> (remove-ultimo (4))
()

13. (2) Escreva um procedimento junta que recebe duas listas, e devolve a lista que resulta
de juntar a segunda lista no final da primeira.

> (junta (3 2 4) (1 2 3))


(3 2 4 1 2 3)
> (junta () (4 5 3))
(4 5 3)
> (junta (1 2 3) ())
(1 2 3)
5.2. EXERCCIOS DE PROGRAMAO 51

14. (2) Escreva um procedimento inverte que recebe uma lista, e devolve a lista que
resulta de inverter a lista original.
Sugesto: Utilize o procedimento insere-no-fim definido no exerccio 11 ou os proce-
dimentos ultimo e remove-ultimo definidos nos exerccios 1 e 12.

> (inverte (3 2 4))


(4 2 3)

15. (3) Escreva um procedimento alisa que recebe uma lista, cujos elementos podem ser
listas, e devolve a lista com todos os elementos atmicos da lista original.
Sugesto: Utilize o procedimento junta definido no exerccio 13.

> (alisa ((((3))) 4 5 (8 (9))))


(3 4 5 8 9)

16. (3) Escreva um procedimento sublistas que recebe uma lista, e conta o nmero total
de sublistas que esta contm.

> (sublistas (1 2 3))


0
> (sublistas ((1) 2 (3)))
2
> (sublistas (((((1))))))
4

17. (2) Escreva um procedimento selecciona-pares que recebe uma lista de nmeros
inteiros, e devolve a lista com todos os nmeros pares da lista original.

> (selecciona-pares (4 3 2 4))


(4 2 4)
> (selecciona-pares (7 3 5))
()

18. (2) Escreva um procedimento selecciona-menores que recebe uma lista de nmeros
inteiros e um nmero inteiro n, e devolve a lista com todos os nmeros da lista original
menores que n.

> (selecciona-menores (4 3 2 4) 4)
(3 2)
> (selecciona-menores (7 3 5) 1)
()

19. (2) Escreva um procedimento selecciona-primos que recebe uma lista de nmeros
inteiros, e devolve a lista com todos os nmeros primos da lista original.

> (selecciona-primos (4 3 2 4))


(3 2)
> (selecciona-primos (4 6 8 9))
()
52 CAPTULO 5. ABSTRACO DE DADOS

20. (2) Escreva um procedimento remove-elemento que recebe uma lista de nmeros intei-
ros e um nmero inteiro n, e devolve a lista que resulta de remover todas as ocorrncias
de n da lista original.

> (remove-elemento (4 3 2 4) 4)
(3 2)
> (remove-elemento (7 3 5) 1)
(7 3 5)

21. (2) Escreva um procedimento altera-posicao que recebe uma lista, um nmero inteiro
positivo p e um nmero inteiro n, e devolve a lista que resulta de alterar o elemento na
posio p da lista para n. Caso a lista tenha menos de p posies dever devolver a lista
original.

> (altera-posicao (4 3 2 2 1 4) 4 10)


(4 3 2 10 1 4)
> (altera-posicao (4 3 2 2 1 4) 100 8)
(4 3 2 2 1 4)

22. (2) Escreva um procedimento posicoes-lista que recebe uma lista de nmeros in-
teiros e um nmero inteiro n, e devolve a lista de todas as posies em que n ocorre na
lista.

> (posicoes-lista (4 3 2 2 1 4) 4)
(1 6)
> (posicoes-lista (4 3 2 2 1 4) 6)
()

23. (2) Escreva um procedimento posicoes-dos-pares que recebe uma lista de nmeros
inteiros, e devolve a lista de todas as posies da lista em que ocorrem nmeros pares.

> (posicoes-dos-pares (4 3 2 2 1 4))


(1 3 4 6)
> (posicoes-dos-pares (5 3 5 3 1))
()

24. (2) Escreva um procedimento ordenada? que recebe uma lista de nmeros inteiros, e
devolve verdadeiro se a lista estiver ordenada de forma crescente e falso no caso contrrio.

> (ordenada? (3 2 1 2 3))


#f
> (ordenada? (3 5 7 8))
#t

25. (3) Escreva um procedimento intercala que recebe duas listas, e devolve a lista que
resulta de intercalar os elementos das duas listas. Se as listas no forem do mesmo
tamanho, o que restar da lista maior dever ser adicionado no fim.
5.2. EXERCCIOS DE PROGRAMAO 53

> (intercala (3 2 4) (1 2 3))


(3 1 2 2 4 3)
> (intercala (2 3) (4 5 8 6))
(2 4 3 5 8 6)

26. (2) Escreva um procedimento insere-ordenado que recebe uma lista ordenada de
nmeros inteiros e um nmero inteiro n, e devolve a lista que resulta de inserir o nmero
n na posio certa na lista de modo a que o resultado continue uma lista ordenada.

> (insere-ordenado (3 5 7 8) 7)
(3 5 7 7 8)
> (insere-ordenado (3 5 7 8) 1)
(1 3 5 7 8)
> (insere-ordenado (3 5 7 8) 15)
(3 5 7 8 15)

27. (3) Escreva um procedimento parte que recebe uma lista de nmeros inteiros lst e
um nmero inteiro n, e devolve uma lista contendo na primeira posio a lista com os
elementos de lst menores que n, e na segunda posio a lista com os elementos de lst
maiores ou iguais a n. A ordem pela qual os elementos aparecem nas listas devolvidas
irrelevante.

> (parte (6 1 2 9 7) 3)
((1 2) (6 9 7))
> (parte (6 1 2 3 9 7) 3)
((1 2) (6 3 9 7))
> (parte (9 12 5) 4)
(() (9 12 5))

28. (2) Escreva um procedimento capicua? que recebe uma lista de nmeros inteiros, e
devolve verdadeiro se a lista for uma capicua e falso no caso contrrio.
Sugesto: Utilize os procedimentos ultimo e remove-ultimo definidos nos exerccios 1
e 12.

> (capicua? (3 2 1 2 3))


#t
> (capicua? (3 2 2 3))
#t
> (capicua? (3 2 1 3 2 3))
#f

29. (3) Escreva um procedimento capicua que recebe uma lista de nmeros inteiros, e
devolve a lista que se obtm construindo uma capicua com a lista original.
Sugesto: Utilize o procedimento insere-no-fim do exerccio 11.

> (capicua (3 4 7 1))


(3 4 7 1 1 7 4 3)
> (capicua (1 2))
(1 2 2 1)
54 CAPTULO 5. ABSTRACO DE DADOS

30. (3) Escreva um procedimento remove-duplicados que recebe uma lista de nmeros
inteiros lst, e fica apenas com uma cpia de cada elemento de lst. A ordem pela qual
os elementos aparecem na lista devolvida irrelevante.
Sugesto: Utilize o procedimento remove-elemento do exerccio 20.

> (remove-duplicados (4 3 2 2 1 4))


(4 3 2 1)
> (remove-duplicados (4 3 2 2 1 4 2))
(4 3 2 1)
> (remove-duplicados (7 5 3 4 6 2))
(7 5 3 4 6 2)

31. (3) Escreva um procedimento elementos-repetidos que recebe uma lista de nmeros
inteiros, e devolve a lista com uma cpia de cada elemento que aparece repetido na lista.
A ordem pela qual os elementos aparecem na lista devolvida irrelevante.
Sugesto: Utilize os procedimentos ocorre-lista? e remove-elemento dos exerc-
cios 7 e 20.

> (elementos-repetidos (3 4 4 4 3 6 7))


(3 4)
> (elementos-repetidos (3 4 6 7))
()

32. (3) Escreva um procedimento conta-elementos que recebe uma lista de nmeros in-
teiros, e devolve uma lista de pares em que cada par contm como primeiro elemento
um elemento da lista e como segundo elemento o nmero de vezes que este aparece na
lista. A ordem pela qual os pares aparecem na lista devolvida irrelevante.
Respeite as barreiras de abstraco, mas lembre-se que est a lidar com dois tipos es-
truturados, a lista e o par.
Sugesto: Utilize os procedimentos ocorre-lista? e remove-elemento dos exerc-
cios 7 e 20.

> (conta-elementos (3 4 5 5 3 3 9 3 3 12 3 12))


((3 . 6) (4 . 1) (5 . 2) (9 . 1) (12 . 2))

33. (2) Escreva um procedimento lista-inteiros que recebe um inteiro positivo n, e


devolva uma lista com todos os inteiros entre 0 e n (a ordem pela qual os nmeros
aparecem na lista no relevante).

> (lista-inteiros 7)
(0 1 2 3 4 5 6 7)

(a) O seu procedimento um procedimento recursivo? Porqu?


(b) O seu procedimento gera um processo iterativo ou recursivo? Porqu?
5.2. EXERCCIOS DE PROGRAMAO 55

(c) Se o seu procedimento gera um processo iterativo, escreva um que gere um processo
recursivo. Se gera um processo recursivo, escreva um que gere um processo iterativo.

34. (4) O Crivo de Eratstenes um algoritmo para calcular nmeros primos que, segundo
a tradio, foi criado pelo matemtico grego Eratstenes (c. 285-194 a.C.), o terceiro
bibliotecrio-chefe da Biblioteca de Alexandria. O algoritmo calcula os nmeros primos
inferiores a n. Para isso, comea-se por criar uma lista com todos os inteiros positivos de

2 a n e seleccionar o nmero 2. Enquanto o nmero seleccionado for menor que n: (a)
removem-se da lista todos os mltiplos desse nmero; (b) passa-se ao nmero seguinte

na lista. No final do algoritmo, quando o nmero seleccionado for superior a n, a lista
apenas contm nmeros primos.
Escreva um procedimento que recebe um inteiro positivo n e calcula a lista de nmeros
primos inferiores a n de acordo com o Crivo de Eratstenes.
Sugesto: Defina um procedimento remove-multiplos que dado uma lista lst e um
nmero inteiro n, remove da lista todos os mltiplos de n.

> (lista-primos 20)


(2 3 5 7 11 13 17 19)
> (lista-primos 100)
(2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97)

5.2.6 rvores Binrias


Definies e Notao
Nesta seco deve considerar os seguintes procedimentos sobre rvores binrias:
(nova-arv) cria uma rvore vazia.
(cria-arv r arve arvd) cria uma rvore binria com raiz r, rvore esquerda arve e
rvore direita arvd.
(raiz arv) dada uma rvore binria arv devolve a sua raiz.
(arv-esq arv) dada uma rvore binria arv devolve a sua rvore esquerda.
(arv-dir arv) dada uma rvore binria arv devolve a sua rvore direita.
(arvore-vazia? arv) devolve verdadeiro se a rvore binria arv vazia e falso no
caso contrrio.
(arvore? arg) devolve verdadeiro se arg for uma rvore binria e falso no caso con-
trrio.
(arvores=? arv1 arv2) devolve verdadeiro se as rvores binrias arv1 e arv2 forem
iguais e falso no caso contrrio.
Um n de uma rvore a a raiz de uma das sub-rvores de a. As razes das sub-rvores
esquerda e direita de um n r dizem-se os filhos de r. Neste caso r diz-se o pai dos dois ns.
Dois ns dizem-se irmos se tiverem o mesmo pai. Uma folha de uma rvore um n sem
filhos.
A profundidade de um n o comprimento do caminho desde a raiz at ele. A profundidade
de uma rvore o comprimento do caminho desde a raiz at ao n mais profundo. O n d
diz-se descendente de a se existir um caminho na rvore de a para d e a profundidade de a
menor que a profundidade de d. Um n a diz-se ascendente de d se d for descendente de a.
56 CAPTULO 5. ABSTRACO DE DADOS

O tamanho de um n o nmero de seus descendentes, incluindo o prprio. O tamanho


de uma rvore o tamanho da sua raiz.
Suponha definidas as seguintes rvores binrias

(define a1 (cria-arv 3
(cria-arv 2
(cria-arv 5 (nova-arv) (nova-arv))
(cria-arv 7 (nova-arv) (nova-arv)))
(cria-arv 5
(cria-arv 1 (nova-arv) (nova-arv))
(cria-arv 6 (nova-arv) (nova-arv)))))

(define a2 (cria-arv 10
(cria-arv 12
(nova-arv)
(nova-arv))
(cria-arv 1
(cria-arv 8 (nova-arv) (nova-arv))
(cria-arv 2 (nova-arv) (nova-arv)))))

(define a3 (cria-arv 5
(nova-arv)
(cria-arv 10
(cria-arv 8 (nova-arv) (nova-arv))
(cria-arv 10 (nova-arv) (nova-arv)))))

cujas representaes grficas so dadas por

3 10 5

2 5 12 1 10

5 7 1 6 8 2 8 10

Exerccios
1. (1) Escreva um procedimento folha? que recebe uma rvore binria, e devolve verda-
deiro se a rvore for uma folha e falso no caso contrrio.

> (folha? (arv-esq a1))


#f
> (folha? (arv-esq a2))
#t

2. (1) Escreva um procedimento tamanho que recebe uma rvore binria, e devolve o
nmero de ns da rvore.

> (tamanho a1)


7
5.2. EXERCCIOS DE PROGRAMAO 57

3. (1) Escreva um procedimento soma-arvore que recebe uma rvore binria contendo
nmeros inteiros, e devolve a soma de todos os ns da rvore.

> (soma-arvore a1)


29

4. (1) Escreva um procedimento procura? que recebe uma rvore binria contendo n-
meros inteiros arv e um nmero inteiro n, e devolve verdadeiro se n ocorre num dos ns
da rvore e falso no caso contrrio.

> (procura? a1 8)
#f
> (procura? a2 8)
#t

5. (1) Escreva um procedimento todos-pares? que recebe uma rvore binria contendo
nmeros inteiros, e devolve verdadeiro se a rvore for constituda exclusivamente por
nmeros pares e falso no caso contrrio.

> (todos-pares? a3)


#f
> (todos-pares? (arv-dir a3))
#t

6. (1) Escreva um procedimento conta-pares-arvore que recebe uma rvore binria


contendo nmeros inteiros, e conta quantos nmeros pares ocorrem na rvore.

> (conta-pares-arvore a1)


2

7. (1) Escreva um procedimento numero-folhas que recebe uma rvore binria, e devolve
o nmero de folhas da rvore.

> (numero-folhas a1)


4
> (numero-folhas a2)
3
> (numero-folhas a3)
2

8. (1) Escreva um procedimento profundidade que recebe uma rvore binria, e devolve
a profundidade da rvore.

> (profundidade a2)


3

9. (2) Escreva um procedimento pai? que recebe uma rvore binria contendo nmeros
inteiros e dois nmeros inteiros p e f, e devolve verdadeiro se p for pai de f na rvore e
falso no caso contrrio.
58 CAPTULO 5. ABSTRACO DE DADOS

> (pai? a1 3 7)
#f
> (pai? a1 3 9)
#f
> (pai? a1 5 1)
#t

10. (2) Escreva um procedimento filho? que recebe uma rvore binria contendo nmeros
inteiros e dois nmeros inteiros f e p, e devolve verdadeiro se f for filho de p na rvore
e falso no caso contrrio.

> (filho? a1 6 3)
#f
> (filho? a1 9 3)
#f
> (filho? a1 5 2)
#t
> (filho? a1 5 3)
#t

11. (2) Escreva um procedimento irmaos? que recebe uma rvore binria contendo n-
meros inteiros e dois nmeros inteiros n e m, e devolve verdadeiro se os nmeros forem
irmos na rvore e falso no caso contrrio.

> (irmaos? a1 2 7)
#f
> (irmaos? a1 2 5)
#t

12. (2) Escreva um procedimento ascendente? que recebe uma rvore binria contendo
nmeros inteiros e dois nmeros inteiros a e d, e devolve verdadeiro se a for ascendente
de d na rvore e falso no caso contrrio.
Sugesto: Utilize o procedimento procura? definido no exerccio 4.

> (ascendente? a1 3 6)
#t
> (ascendente? a1 3 9)
#f
> (ascendente? a1 2 5)
#t
> (ascendente? a1 3 5)
#t

13. (2) Escreva um procedimento descendente? que recebe uma rvore binria contendo
nmeros inteiros e dois nmeros inteiros d e a, e devolve verdadeiro se d for descendente
de a na rvore e falso no caso contrrio.
5.2. EXERCCIOS DE PROGRAMAO 59

> (descendente? a1 6 5)
#t
> (descendente? a1 7 3)
#t
> (descendente? a1 2 5)
#f

14. (2) Uma rvore binria diz-se prpria se todos os seus ns tm dois filhos ou so
folhas. Escreva um procedimento arv-propria? que recebe uma rvore binria, e
devolve verdadeiro se a rvore for prpria e falso no caso contrrio.

> (arv-propria? a1)


#t
> (arv-propria? a2)
#t
> (arv-propria? a3)
#f

15. (2) Uma rvore binria diz-se perfeita se prpria e todas as suas folhas esto ao
mesmo nvel. Escreva um procedimento arv-perfeita? que recebe uma rvore binria,
e devolve verdadeiro se a rvore for perfeita e falso no caso contrrio.
Sugesto: Utilize o procedimento profundidade definido no exerccio 8.

> (arv-perfeita? a1)


#t
> (arv-perfeita? a2)
#f
> (arv-perfeita? a3)
#f

16. (3) Uma rvore binria diz-se balanceada se for prpria e todas as suas folhas diferem
no mximo de um nvel. Escreva um procedimento arv-balanceada? que recebe uma
rvore binria, e devolve verdadeiro se a rvore for balanceada e falso no caso contrrio.
Sugesto: Utilize o procedimento profundidade definido no exerccio 8.

> (arv-balanceada? a1)


#t
> (arv-balanceada? a2)
#t
> (arv-balanceada? a3)
#f

17. (3) Escreva um procedimento maximo que recebe uma rvore binria no vazia contendo
nmeros inteiros, e devolve o maior elemento da rvore.

> (maximo a1)


7
60 CAPTULO 5. ABSTRACO DE DADOS

18. (3) Escreva um procedimento minimo que recebe uma rvore binria no vazia contendo
nmeros inteiros, e devolve o menor elemento da rvore.

> (minimo a2)


1

19. (3) Escreva um procedimento mais-profundo que recebe uma rvore binria no vazia,
e devolve o n mais profundo da rvore. Caso existam vrios mesma profundidade
dever devolver o mais esquerda na rvore.
Sugesto: Utilize o procedimento profundidade definido no exerccio 8.

> (mais-profundo a1)


5
> (mais-profundo a2)
8

20. (4) Escreva um procedimento profundidade-minima que recebe uma rvore binria
no vazia contendo nmeros inteiros e um nmero inteiro n, e devolve a profundidade
mnima a que n ocorre na rvore. Caso o nmero no ocorra na rvore dever devolver
falso.
Sugesto: Utilize o procedimento mais-profundo definido no exerccio 19.

> (profundidade-minima a1 5)
2
> (profundidade-minima a1 1)
3
> (profundidade-minima a1 9)
#f

21. (2) Escreva um procedimento lista-folhas que recebe uma rvore binria, e devolve
a lista com todas as suas folhas comeando da mais esquerda para a mais direita.
Sugesto: Utilize o procedimento junta definido no exerccio 13.

> (lista-folhas a2)


(12 8 2)
> (lista-folhas a3)
(8 10)

22. (2) Escreva um procedimento espelha que recebe uma rvore binria e devolve uma
nova rvore binria idntica recebida, mas em que em cada nvel da rvore se trocou
a rvore esquerda com a direita, mantendo-se a raiz.

> (espelha a1)

deve devolver a rvore cuja representao grfica


5.2. EXERCCIOS DE PROGRAMAO 61

5 2

6 1 7 5

23. (2) Escreva um procedimento substitui que recebe uma rvore binria contendo
nmeros inteiros e dois nmeros inteiros v (velho) e n (novo), e devolve a rvore que
resulta de substituir todas as ocorrncias de v por n.

> (substitui a1 5 8)

deve devolver a rvore cuja representao grfica

2 8

8 7 1 6

24. (2) Escreva um procedimento poda que recebe uma rvore binria, e devolve a rvore
que resulta de remover todas as folhas da rvore.

> (poda a2)

deve devolver a rvore cuja representao grfica

10

25. (4) Escreva um procedimento promove-irmao que recebe uma rvore binria contendo
nmeros inteiros, e que em cada uma das suas sub-rvores coloca o irmo maior como
raiz da rvore direita.

> (promove-irmao a2)

deve devolver a rvore cuja representao grfica

10

1 12

2 8
62 CAPTULO 5. ABSTRACO DE DADOS

26. (4) Escreva um procedimento promove-descendente que recebe uma rvore binria
contendo nmeros inteiros, e que em cada uma das suas sub-rvores coloca o seu maior
elemento na raiz. Nos casos em que h troca da raiz r por m, ento r dever ocupar o
lugar onde m estava.
Sugesto: Defina um procedimento substitui1 que recebe uma rvore arv e dois
nmeros v e n e substitui uma nica ocorrncia de v por n na rvore arv.

> (promove-descendente a1)

deve devolver a rvore cuja representao grfica

5 6

2 3 1 5

27. (4) Uma rvore binria contendo nmeros inteiros diz-se de procura se a sua raiz
maior que todos os elementos da sua sub-rvore esquerda, menor ou igual que todos os
elementos da sua sub-rvore direita, e o mesmo se passa para todas as suas sub-rvores.
Escreva um procedimento arv-procura? que recebe uma rvore binria, e devolve
verdadeiro se a rvore for uma rvore binria de procura e falso no caso contrrio.

> (arv-procura? a1)


#f
> (arv-procura? a3)
#t

28. (2) Escreva um procedimento existe-arv-procura? que recebe uma rvore binria
de procura contendo nmeros inteiros e um nmero inteiro n, e devolve verdadeiro se o
nmero n ocorre num dos ns da rvore e falso no caso contrrio.
Nota: O seu procedimento deve tirar partido do facto de receber uma rvore binria
de procura e no uma rvore binria qualquer.

> (existe-arv-procura? a3 8)
#t
> (existe-arv-procura? a3 9)
#f

29. (3) Escreva um procedimento insere-arvore-procura que recebe uma rvore binria
de procura contendo nmeros inteiros e um nmero inteiro n, e devolve a rvore binria
de procura que resulta de inserir o nmero n na rvore.

> (insere-arvore-procura a3 9)
5.2. EXERCCIOS DE PROGRAMAO 63

deve devolver a rvore cuja representao grfica

10

8 10

30. (2) Escreva um procedimento cria-arvore-procura que recebe zero ou mais nmeros
inteiros, e devolve uma rvore binria de procura criada a partir desses argumentos. O
primeiro argumento, caso exista, dever ser a raiz da rvore.

> (cria-arvore-procura 2 1 5 3)

deve devolver a rvore cuja representao grfica

1 5

3
64 CAPTULO 5. ABSTRACO DE DADOS
Captulo 6

Procedimentos de ordem superior

6.1 Exerccios de reviso


1. Diga quando que em programao se diz que um objecto computacional um cidado
de primeira classe.

2. Diga o que um procedimento de ordem superior e quais so as suas vantagens.

6.2 Exerccios de programao


6.2.1 Procedimentos que recebem procedimentos
1. (1) Escreva um procedimento annimo que recebe um procedimento e um nmero e
devolve o resultado de aplicar o procedimento ao triplo do quadrado do nmero.

2. O procedimento somatorio

(define (somatorio calc-termo lim-inf proximo lim-sup)


(if (> lim-inf lim-sup)
0
(+ (calc-termo lim-inf)
(somatorio calc-termo
(proximo lim-inf)
proximo
lim-sup))))

apenas o mais simples de um vasto nmero de abstraces semelhantes que podem


ser capturadas por procedimentos de ordem superior. Por exemplo, podemos usar o
procedimento somatorio para somar os quadrados dos mltiplos de 3 entre 9 e 21:

(somatorio (lambda (x) (expt x 2))


9
(lambda (x) (+ x 3))
21)
66 CAPTULO 6. PROCEDIMENTOS DE ORDEM SUPERIOR

(a) (2) Diga o que fazem as seguintes utilizaes desse procedimento:


i. (somatorio (lambda (x) x) 4 add1 500)
ii. (somatorio (lambda (x) (sqrt x)) 5 (lambda (x) (+ x 5)) 500)
iii. (somatorio (lambda (x) (somatorio (lambda (x) x) 1 add1 x)) 1 add1
5)
(b) (2) Mostre como que o procedimento somatorio poderia ser definido gerando um
processo iterativo (em vez de gerar um processo recursivo, como faz actualmente).
(c) (2) Defina um procedimento piatorio que calcula o produto dos termos de uma
funo entre dois limites especificados.
(d) (2) Mostre como definir o factorial em termos da utilizao do procedimento
piatorio.

3. A converso de valores uma operao comum em programao. Por exemplo, convertem-


se temperaturas em graus Farenheit para graus Centgrados, horas locais em Lisboa para
horas locais em Nova Iorque, etc.

(a) (2) Escreva um procedimento converte que recebe o procedimento correspon-


dente funo de converso e o valor a converter e devolve o valor convertido. Por
exemplo, se far-cent for o procedimento correspondente funo de converso de
graus Farenheit em Centgrados definido como
(define (far-cent f)
(/ (* 5 (- f 32)) 9))
a avaliao de (converte far-cent 32) tem o valor 0.
(b) (2) Escreva um procedimento lis-ny para converter uma hora local em Lisboa
(um nmero inteiro entre 0 e 23) para a hora local em Nova Iorque (onde so
menos cinco horas do que em Lisboa). Tenha cuidado com a passagem da meia
noite. Utilize o procedimento converte da alnea anterior e o procedimento lis-ny
para mostrar qual a hora em Nova Iorque quando so 3 da manh em Lisboa.

4. (3) Escreva um procedimento nenhum-p? que recebe um nmero inteiro positivo n e


um predicado p, e devolve verdadeiro se nenhum inteiro positivo menor que n satisfaz p
e falso no caso contrrio.

> (nenhum-p? 87 (lambda (x) (= 0 (remainder x 100)))


#t
> (nenhum-p? 187 (lambda (x) (= 0 (remainder x 100)))
#f

5. (1) Escreva os procedimentos dos exerccios 18 e 19 da seco 2.2.3 (primos-entre-si?


e divisor-fraco?) utilizando o procedimento nenhum-p?.

6. (1) Escreva os procedimentos dos exerccios 10, 11, 12 e 13 da seco 3.2 (quadrado-perfeito?,
primo?, livre-quadrados?, poderoso?) utilizando o procedimento nenhum-p.
6.2. EXERCCIOS DE PROGRAMAO 67

7. (2) Escreva um procedimento conta-p que recebe um nmero inteiro positivo n e um


predicado p, e devolve o nmero de inteiros positivos menores ou iguais a n que satisfazem
p.

> (conta-p 87 (lambda (x) (= 0 (remainder x 100)))


0
> (conta-p 487 (lambda (x) (= 0 (remainder x 100)))
4

8. (1) Escreva os procedimentos dos exerccios 6, 7 e 8 da seco 2.2.3 (numero-divisores,


numero-primos-menores e numero-divisores-primos) utilizando o procedimento conta-p.

9. (2) Escreva um procedimento soma-p que recebe um nmero inteiro positivo n e um


predicado p, e devolve a soma de todos os inteiros positivos menores do que n que
satisfazem p.

> (soma-p 87 (lambda (x) (= 0 (remainder x 100)))


0
> (soma-p 487 (lambda (x) (= 0 (remainder x 100)))
1000

10. (1) Escreva os procedimentos dos exerccios 2 e 9 da seco 2.2.3 (somatorio e soma-divisores)
utilizando o procedimento soma-p.

11. (3) Escreva um procedimento nesimo-p que recebe um nmero inteiro positivo n e um
predicado p, e devolve o n-simo elemento que satisfaz p.

> (nesimo-p 4 (lambda (x) (= 0 (remainder x 100)))


400
> (nesimo-p 4 even?)
8

12. (1) Escreva os procedimentos dos exerccios 22, 23, 24, e 25 da seco 3.2 (nesimo-primo,
nesimo-primo-mersenne, k-divisor, e kesimo-factor-primo) utilizando o procedi-
mento nesimo-p.

13. (3) Escreva um procedimento soma-digitos-p que recebe um nmero inteiro positivo
n e um predicado p, e devolve a soma de todos os dgitos de n que satisfazem p.

> (soma-digitos-p 97 (lambda (x) (< x 5)))


0
> (soma-digitos-p 1452 (lambda (x) (< x 5)))
7

14. (1) Escreva os procedimentos dos exerccios 14 e 15 da seco 2.2.3 (soma-digitos e


soma-digitos-pares) utilizando o procedimento soma-digitos-p.
68 CAPTULO 6. PROCEDIMENTOS DE ORDEM SUPERIOR

15. (3) Escreva um procedimento existe-digito-p? que recebe um nmero inteiro posi-
tivo n e um predicado p, e devolve verdadeiro se ocorrer um dgito em n que satisfaa p
e falso no caso contrrio.

> (existe-digito-p? 234 (lambda (x) (< x 5)))


#t
> (existe-digito-p? 558 (lambda (x) (< x 5)))
#f

16. (1) Escreva o procedimento do exerccio 29 da seco 3.2 (existe-digito?) utilizando


o procedimento existe-digito-p?.

17. (4) Escreva um procedimento digitos-p que recebe um nmero inteiro positivo n e
um predicado p, e devolve o nmero composto apenas pelos dgitos de n que satisfazem
p. Se nenhum dos dgitos de n satisfizer p deve devolver 0.

> (digitos-p 9558 (lambda (x) (< x 5)))


0
> (digitos-p 2458 (lambda (x) (< x 5)))
24

18. (1) Escreva o procedimento do exerccio 16 da seco 2.2.3 (digitos-impares) utili-


zando o procedimento digitos-p.

19. (2) Escreva um procedimento conta que recebe uma lista e um predicado unrio, e
devolve o nmero de elementos da lista que satisfazem o predicado.

> (conta (4 5 6) (lambda(x) (> x 5)))


1

20. (1) Escreva os procedimentos dos exerccios 3, 4, e 5 da seco 5.2.5 (conta-pares,


conta-menores, e numero-ocorrencias) utilizando o procedimento conta.

21. (2) Escreva um procedimento todos? que recebe uma lista e um predicado unrio, e
devolve verdadeiro caso todos os elementos da lista satisfaam o predicado e falso no
caso contrrio.

> (todos? (4 5 6) (lambda(x) (> x 5)))


#f
> (todos? (4 5 6) (lambda(x) (>= x 4)))
#t

22. (1) Escreva o procedimento do exerccio 6 da seco 5.2.5 (todos-pares) utilizando o


procedimento todos?.

23. (2) Escreva um procedimento existe? que recebe uma lista e um predicado unrio, e
devolve verdadeiro se existir pelo menos um elemento da lista que satisfaa o predicado
e falso no caso contrrio.
6.2. EXERCCIOS DE PROGRAMAO 69

> (existe? (4 5 6) (lambda(x) (> x 5)))


#t
> (existe? (4 5 6) (lambda(x) (>= x 4)))
#t
> (existe? (4 5 6) (lambda(x) (< x 4)))
#f

24. (1) Escreva o procedimento do exerccio 7 da seco 5.2.5 (ocorre-lista) utilizando


o procedimento existe?.
25. (2) Escreva um procedimento nem-todos? que recebe uma lista e um predicado unrio,
e devolve verdadeiro caso exista pelo menos um elemento da lista que no satisfaz o
predicado e falso no caso contrrio.

> (nem-todos? (2 4 5 6) even?)


#t
> (nem-todos? (2 4 6) even?)
#f

26. (2) Escreva um procedimento transforma que recebe uma lista e um procedimento
unrio f, e devolve a lista que resulta de aplicar o procedimento a todos os elementos
da lista.

> (transforma (4 3 2 4) (lambda(x) (- x 1)))


(3 2 1 3)
> (transforma (4 3 2 4) (lambda(x) (>= x 4)))
(#t #f #f #t)

27. (2) Escreva os procedimentos dos exerccios 9 e 10 da seco 5.2.5 (quadrados-lista


e substitui) utilizando o procedimento transforma (este apresentado na Pgina 207
do livro).

28. (2) Escreva um procedimento filtra que recebe uma lista l e um predicado p, e
devolve a lista que resulta de ficar com todos os elementos da lista l que satisfazem o
predicado p.

> (filtra (4 3 2 1 4) (lambda(x) (< 1 x 4)))


(3 2)

29. (2) Escreva os procedimentos dos exerccios 17, 18, 19, e 20 da seco 5.2.5 (selecciona-pares,
selecciona-menors, selecciona-primos, e remove-elemento) utilizando o procedi-
mento filtra.
30. (2) Escreva um procedimento posicoes-p que recebe uma lista e um predicado, e
devolve a lista de todas as posies em que o elemento da lista satisfaz o predicado.

> (posicoes-p (4 3 2 2 1 4) (lambda(x) (< x 3)))


(3 4 5)
> (posicoes-p (4 3 2 2 1 4) (lambda(x) (> x 4)))
()
70 CAPTULO 6. PROCEDIMENTOS DE ORDEM SUPERIOR

31. (2) Escreva os procedimentos dos exerccios 22 e 23 da seco 5.2.5 (posicoes-lista


e posicoes-dos-pares) utilizando o procedimento posicoes-p.

32. (2) Escreva um procedimento da-pares que recebe um procedimento, um valor e uma
lista e que devolve uma lista de pares em que cada par contm o elemento da lista seguido
do valor obtido da aplicao do procedimento ao valor e ao elemento da lista respectivo.

> (da-pares (lambda (x y) (+ x y)) 3 (2 4 3 5 6))


((2 5) (4 7) (3 6) (5 8) (6 9))
> (da-pares (lambda (x y) (* x y)) 2 ())
()
> (da-pares (lambda (x y) (* x y)) 9 (1 3))
((1 9) (3 27))

33. (2) Escreva um procedimento de ordem superior chamado lista-de-a-n-pred que


recebe dois nmeros inteiros (de e ate) e um predicado aplicvel a inteiros (pred) e que
devolve a lista de todos os inteiros ente de e ate que satisfazem o predicado pred. Por
exemplo:

> (lista-de-a-n-pred 1 10 even?)


(2 4 6 8 10)
> (lista-de-a-n-pred 1 10 (lambda (x) #t))
(1 2 3 4 5 6 7 8 9 10)

34. (4) Usando o procedimento lista-de-a-n-pred e outros procedimentos de ordem


superior, escreva um procedimento correspondente ao crivo de Eratstenes.

35. (2) Escreva um procedimento conta-arvore que recebe uma rvore binria e um
predicado p que se aplica a cada um dos ns da rvore, e conta quantos elementos
da rvore satisfazem p.

> (conta-arvore a1 odd?)


5
> (conta-arvore a1 (lambda (x) (> x 5)))
2

36. (2) Escreva os procedimentos dos exerccios 2, 4, e 6 da seco 5.2.6 (tamanho, procura?,
e conta-pares-arvore) utilizando o procedimento conta-arvore.

37. (2) Escreva um procedimento conta-subarvore que recebe uma rvore binria a e um
predicado p que se aplica a rvores, e conta quantas subrvores de a satisfazem p.

> (define (dois-filhos? a)


(and (not (arvore-vazia? a))
(not (arvore-vazia? (arv-esq a)))
(not (arvore-vazia? (arv-dta a)))))
> (conta-subarvore a1 dois-filhos?)
6.2. EXERCCIOS DE PROGRAMAO 71

3
> (conta-subarvore a2 dois-filhos?)
2
> (conta-subarvore a3 dois-filhos?)
1

38. (2) Escreva os procedimentos dos exerccios 7, 9, e 10 da seco 5.2.6 (numero-folhas,


pai?, filho?) utilizando o procedimento conta-subarvore.

39. (2) Escreva um procedimento aplica-f-arvore que recebe uma rvore binria e um
procedimento f que se aplica raiz de uma rvore, e devolve a rvore que resulta de
aplicar o procedimento a todos os elementos da rvore.

> (aplica-f-arvore a2 (lambda(x) (* x x)))

deve devolver a rvore cuja representao grfica


100

144 1

64 4

40. (2) Escreva o procedimento do exerccio 23 da seco 5.2.6 (substitui) utilizando o


procedimento transforma.

6.2.2 Procedimentos que produzem procedimentos


1. (1) A composio de duas funes de um argumento, f (x) e g(x), a funo f (g(x)).
Escreva um procedimento fn-composta que recebe como argumentos dois procedimentos
correspondentes a funes de um argumento e que devolve o procedimento correspon-
dente composio dos seus argumentos.
Por exemplo, com o seu procedimento, seria gerada a seguinte interaco:

> (define (quadrado x) (* x x))


> (define (soma-6 y) (+ 6 y))
> ((fn-composta quadrado soma-6) 3)
81

2. (a) (2) Escreva um procedimento fn-soma que receba como argumentos dois pro-
cedimentos correspondentes a funes reais de varivel real, f e g, e devolva o
procedimento correspondente funo correspondente soma de f com g.
Por exemplo, com este procedimento podemos gerar a interaco:
> (define (f1 x) (+ x 3))
> (define (f2 y) (* y 10))
> ((fn-soma f1 f2) 12)
135
72 CAPTULO 6. PROCEDIMENTOS DE ORDEM SUPERIOR

(b) (2) Podemos pensar numa generalizao do procedimento do exerccio anterior,


fornecendo a operao a realizar entre as funes f e g. Por exemplo, se a operao
for a adio, o procedimento corresponde ao anterior, devolvendo f (x) + g(x); no
entanto, se a operao for a potncia, o procedimento devolve f (x)g(x) .
Escreva um procedimento aplica-op que recebe como argumentos uma operao
(aplicvel a dois argumentos) e duas funes reais de varivel real e que devolve o
procedimento que corresponde a aplicar a operao fornecida s duas funes.
Por exemplo,
> (define (f1 x) (+ x 3))
> (define (f2 y) (* y 10))
> ((aplica-op + f1 f2) 12)
135
> ((aplica-op * f1 f2) 12)
1800

3. (2) Defina um procedimento funcao-i que recebe procedimentos para calcular as fun-
es reais de varivel real f , g e h e devolve um procedimento que se comporta como a
seguinte funo matemtica:

i(x) = 2f (x)2 + 3g(x)3 h(x2 )

4. (2) Escreva um procedimento nega que recebe como argumento um predicado de dois
argumentos e que devolve o procedimento correspondente negao do seu argumento.

> ((nega >) 2 3)


#t
> ((nega >) 2 2)
#t
> ((nega <=) 4 5)
#f

5. (2) Escreva o procedimento conjuncao que recebe dois predicados de um argumento


cada, e devolve um novo predicado de um argumento que verifica se esse argumento
satisfaz ambos os predicados recebidos originalmente.

> (define par>5? (conjuncao even? (lambda (x) (> x 5))))


> (par>5? 4)
#f
> (par>5? 8)
#t
> (par>5? 9)
#f

6. (a) (2) Escreva um procedimento faz-arredonda que recebe um inteiro n, e devolve


um procedimento que recebe um argumento real e o arredonda para n casas deci-
mais.
6.2. EXERCCIOS DE PROGRAMAO 73

(b) (2) Utilize o procedimento faz-arredonda para definir o procedimento arredonda-3,


que recebe um real e o arredonda para 3 casas decimais.
> (arredonda-3 1.23456)
1.235

7. (2) Escreva um procedimento que recebe um nmero e devolve um procedimento que


recebe outro nmero e o multiplica pelo primeiro.

> (define mult5 (cria-multiplicador 5))


> (mult5 2)
10

8. (2) Considere as seguintes definies para um procedimento que devolve a primeira


derivada de uma funo:

(define (derivada f)
(lambda (x)
(/ (- (f (+ x dx)) (f x))
dx)))

(define dx 0.00001)

Com base na definio anterior escreva um procedimento que recebe um procedimento


correspondente a uma funo e um inteiro positivo n (n >= 1) e devolve a derivada de
ordem n da funo. Lembre-se que a derivada de ordem n de uma funo a derivada
da derivada de ordem n - 1. Utilize o procedimento derivada.

9. (2) Escreva um procedimento rasto que recebe uma cadeia de caracteres correspon-
dendo ao nome de um procedimento, e um procedimento de um argumento. O procedi-
mento rasto devolve um procedimento de um argumento que escreve no cran (usando
o procedimento primitivo display) a indicao de que o procedimento foi avaliado e o
valor do seu argumento, escreve tambm o resultado do procedimento, e devolve o valor
de aplicar o procedimento original ao argumento recebido. Por exemplo, partindo do
princpio que o procedimento quadrado foi definido, podemos gerar a seguinte interaco:

> (define rasto-quadrado (rasto "quadrado" quadrado))


> (rasto-quadrado 4)
Avaliao de quadrado, com o argumento 4
Resultado 16
16
>

10. A sequncia de Fibonacci (ou nmeros de Fibonacci) definida recursivamente do se-


guinte modo:

0 se n = 0
f ib(n) = 1 se n = 1
f ib(n 1) + f ib(n 2) se n > 1

74 CAPTULO 6. PROCEDIMENTOS DE ORDEM SUPERIOR

ou seja, depois dos dois termos iniciais, cada termo da sequncia corresponde soma
dos dois termos anteriores.
Sequncias semelhantes de Fibonacci, mas com termos iniciais diferentes, tm sido des-
cobertas como transcrevendo vrios aspectos da natureza. Um dos exemplos, a sequncia
de Lucas, em honra ao Matemtico francs Franois Lucas (18421891), corresponde
sequncia 3, 1, 4, 5, 9, . . ..
A sequncia de Fibonacci pode ser generalizada a uma coleco de sequncias, para-
metrizadas com base nos dois primeiros termos, a e b e definidas atravs da seguinte
expresso:

a se n = 0
Fa,b (n) = b se n = 1
Fa,b (n 1) + Fa,b (n 2) se n > 1

Assim, F0,1 (n) uma expresso designatria correspondente ao n-simo termo da sequn-
cia de Fibonacci, F3,1 (n), uma expresso designatria correspondente ao n-simo termo
da sequncia de Lucas.

(a) (2) Defina um procedimento que d origem a um procedimento que calcula o


n-simo termo da sequncia generalizada de Fibonacci. O seu procedimento deve
receber como argumentos os dois primeiros termos da sequncia, produzindo um
procedimento de um argumento que calcula o n-simo termo de uma sequncia
particular. O procedimento deve gerar um processo iterativo.
(b) (2) Use o procedimento do exerccio anterior para gerar outro procedimento que
calcula a sequncia generalizada de Fibonacci cujos dois primeiros termos so o ano
do seu nascimento e o seu nmero de aluno. Usando este procedimento, calcule
o termo cuja posio corresponde a 10 somado ao ms do seu nascimento. Por
exemplo, um aluno nascido em Maro de 1988 e cujo nmero 12345 dever calcular
o valor de F1988,12345 (13).
(c) (2) Um dos aspectos interessantes associados s sequncias de Fibonacci generali-
zadas corresponde ao facto de, independentemente dos valores de a e b, o limite da
razo entre um termo e o anterior quando n tende para infinito sempre o mesmo:

Fa,b (n + 1)
lim =
n Fa,b (n)
em que (leia-se Phi, o qual no deve ser confundido com o nmero ) dado por

1+ 5
= 1.6180
2
Phi um nmero transcendente conhecido por proporo divina, proporo urea ou
nmero de ouro. A proporo divina foi recentemente glorificada no livro de Dan
Brown, O Cdigo da Vinci. Este nmero, frequentemente usado nas propores
das pinturas renascentistas, est envolvido com a natureza do crescimento. O
nmero pode ser encontrado na proporo em conchas, seres humanos, e at
na relao entre os machos e fmeas de qualquer colmeia do mundo. Por esta
6.2. EXERCCIOS DE PROGRAMAO 75

razo, os antigos consideravam que este nmero tinha sido utilizado pelo Criador
do universo e chamavam-lhe a proporo divina. Esta proporo corresponde
relao que resulta quando uma linha dividida de tal modo que o comprimento
total da linha tem a mesma relao com o comprimento do segmento maior que o
comprimento do segmento maior tem com o comprimento do segmento menor.
Usando um mtodo de aproximaes sucessivas semelhante ao apresentado na Sec-
o 2.4.3 do livro, escreva um procedimento de ordem superior que calcule o valor
da proporo divina com uma preciso de 10 casas decimais. O argumento do seu
procedimento dever ser um procedimento para o clculo da sequncia de Fibo-
nacci. O seu procedimento dever utilizar expresses let para evitar clculos
repetidos.
76 CAPTULO 6. PROCEDIMENTOS DE ORDEM SUPERIOR
Captulo 7

O desenvolvimento de programas

7.1 Exerccios de reviso


1. Diga quais so as fases por que passa o desenvolvimento de um programa e o que se faz
em cada uma delas.

2. Enuncie e explique cada um dos tpicos que so habitualmente focados na documentao


de utilizao que acompanha um programa.

3. Em programao podemos ter erros sintcticos e erros semnticos. Defina cada um deles
e d exemplos.

4. Durante o desenvolvimento de um programa, aps a programao da soluo, segue-se


a fase de testes. Explique no que consiste a fase de testes.

5. O que a depurao? Que tipos de depurao so efectuados nos programas e para que
tipos de erros?

6. O que a depurao da base para o topo? Qual a sua vantagem?

7. Comente a seguinte expresso: A documentao de um programa deve ser efectuada


aps o cdigo terminado, para garantir que no existem erros nessa mesma documenta-
o.

8. Escolha a nica resposta correcta. A documentao de um programa:

(a) Apenas deve ser escrita aps o programa ter sido concludo.
(b) constituda por vrios tipos de documentos.
(c) No pode ser alterada na fase de manuteno.
(d) Deve ser evitada, sempre que possvel, pois corresponde a um trabalho desnecess-
rio.

9. Escolha a nica resposta incorrecta. Em relao metodologia de desenvolvimento de


programas pode dizer-se que:

(a) Na fase da programao da soluo decide-se a representao para as estruturas de


informao.
78 CAPTULO 7. O DESENVOLVIMENTO DE PROGRAMAS

(b) A depurao lida com erros semnticos e erros sintcticos.


(c) A fase de desenvolvimento da soluo recorre a uma linguagem de programao.
(d) A fase de testes nunca permite garantir a ausncia completa de erros.

7.2 Exerccios de programao


1. (2) Sugira casos de teste para o procedimento seguinte:

(define (saudacao hora)


(cond ((> hora 12) "Boa tarde !")
((> hora 19) "Boa noite !")
(else "Bom dia !")))

2. (1) Com base nos casos de teste concebidos, explique qual o problema com o procedi-
mento saudacao.

3. (2) Sugira casos de teste para o procedimento seguinte:

(define (misterio a)
(cond ((> a 0) #t)
((< a 3) #t)
((= a 1) (+ a 5))
(else (misterio (- a 2)))))

4. (1) Com base nos casos de teste concebidos, explique qual o problema com o procedi-
mento misterio.

Você também pode gostar