Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios...

37
Exercícios da cadeira de Introdução à Programação Cláudia Antunes Ana Cardoso Cachopo João Cachopo Francisco Couto António Leitão Inês Lynce César Pimentel H. Sofia Pinto Ano Lectivo 2002/2003 Parte I

Transcript of Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios...

Page 1: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

ExercíciosdacadeiradeIntroduçãoàProgramação

CláudiaAntunesAnaCardosoCachopo

JoãoCachopoFranciscoCoutoAntónioLeitão

InêsLynceCésarPimentelH. SofiaPinto

Ano Lectivo 2002/2003ParteI

Page 2: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

i

Prefácio

EstedocumentoreúneosexercíciospropostosnasaulaspráticasdacadeiradeIntroduçãoàPro-gramaçãodaLicenciaturaemEngenhariaInformáticae deComputadoresdo Instituto SuperiorTécniconos anoslectivos 1998/1999, 1999/2000, 2000/2001e 2001/2002. Estacompilaçãodestina-seaserusadanascadeirasdaLicenciaturaemEngenhariaInformáticaedeComputado-res(LEIC), daLicenciaturadosSistemasdeInformaçãoeMultimédia(LESIM) edaLicenciaturaemEngenhariadeRedesdeComunicaçãoedeInformação(LERCI) noanolectivo 2002/2003.Algunsdestesexercícioscorrespondemà traduçãodeexercíciospropostosno livro detexto re-feridonabibliografia(opcional)dacadeira:

� HaroldAbelsonandGeraldJaySussmanwith JulieSussman,StructureandInterpretationof ComputerPrograms, SecondEdition,MIT Press,1996.

Semprequetal severifiqueapareceassociadoaonúmerodoexercícioumaindicaçãodonúmeroqueo exercíciotemno referidolivro.

InêsLynce(editora)

Page 3: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

CONTEÚDO 1

Conteúdo

1 Noçõesbásicas 2

2 Procedimentoscompostos 4

3 Processosgeradospor procedimentos 10

4 Procedimentosdeordem superior 13

5 TiposAbstractosde Inf ormação 20

6 O Desenvolvimento deprogramas 35

Page 4: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

1 NOÇÕESBÁSICAS 2

1 Noçõesbásicas

Exercício1.1Traduzaasseguintesexpressõesparaanotaçãoprefixa:

���������������� ����� �� ������� ����������������� ������������� � ������� ������������ � ������������ � ������������������������������ ���!

Exercício1.2(Livro — 1.2)Traduzaaseguinteexpressãoparaanotaçãoprefixa:���"��� � ��� � ��� � ���$#%&�'�(�

� � ���)��� � ���) ��

Exercício1.3(Livro — 1.1 e outros)Em baixo é apresentadaumasequênciade expressões.Diga qual é oresultadoimpressopelointerpretadordeSchemequandoéavaliadacadaumadessasexpressões.Assumaqueasequênciaéavaliadapelaordemapresentada.

10

(+ 5 3 4)

(- 9 1)

(/ 6 2)

(+ (* 2 4) (- 4 6))

(+ (* (+ (* 2 3) 4) 5) 6)

(/ (* (/ (* 2 3) 3) 4) 4)

(+ (- (+ (- (+ 1 2) 3) 4) 5) 6)

(- (+ (- (+ (- 1 2) 3) 4) 5) 6)

(define a 3)

(define b (+ a 1))

Page 5: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

1 NOÇÕESBÁSICAS 3

(+ a b (* a b))

(= a b)

(and (<= a b)(even? a)(odd? b))

(max (quotient a 2)(remainder b 2))

Page 6: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

2 PROCEDIMENTOSCOMPOSTOS 4

2 Procedimentoscompostos

Exercício2.1Avalieasseguintesexpressões:

((lambda (x)(+ x 2)) 5)

((lambda (x y)(+ x y)) 1 2)

(lambda (x)(* x x))

((lambda (x y)(+ (* 2 x) y)) 5 3)

((lambda (x y)(+ (* 2 x)

(* 3 y))) 1 2)

Exercício2.2Definaum procedimentoquecalculao perímetro deumacircunferência*,+ �.-0/ .

Exercício2.3Definaum procedimentoquecalculaaáreadeumacircunferência12+ -3/�� .

Exercício2.4Definaum procedimentoquecalculao volumedeumaesfera45+76� -3/�� .

Exercício2.5Definaum procedimentoquecalculao volume de umacascaesféricade raio interior

/98e raio

exterior/ � .

Exercício2.6Definaum procedimentoquecalculaa altura : a queseencontraum objectoquesedeixacairdeumaaltura :9; comvelocidadeinicial 4�; aofim deum tempo< . ( :=+>:�; � 4�;'< � 8

�@? < �@A ? +B�C !.DE��FG�).

Exercício2.7Definaum procedimentochamadohipotenusa que,dadososcomprimentosdosdoiscatetosdeum triângulorectângulo,calculao comprimentodahipotenusa.Dadososcomprimentosdoscatetos1 e H do triângulo, ahipotenusa: écalculadacomo: :,+�I 1 � � H �

Exercício2.8Definaum procedimento chamadoperimetro que,dadosos comprimentosdosdois catetosdeum triângulorectângulocalculao seuperímetro. O perímetrodeumafigurageométricaé asomadoscomprimentosdetodososseuslados.

Page 7: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

2 PROCEDIMENTOSCOMPOSTOS 5

Exercício2.9(Livro — 1.1) Em baixo é apresentadaumasequênciade expressões.Diga qual é o resultadoimpressopelointerpretadordeSchemequandoé avaliadacadaumadessasexpressões.Assumaqueasequênciaéavaliadapelaordemapresentada.

(define a 3)

(define b (+ a 1))

(if (and (> b a) (< b (* a b)))ba)

(cond ((= a 4) 6)((= b 4) (+ 6 7 a))(else 25))

(+ 2 (if (> b a) b a))

(* (cond ((> a b) a)((< a b) b)(else -1))

(+ a 1))

Exercício2.10Escreva um procedimentoanónimoem Schemeque recebedois númerose devolve o maiordeles.

Exercício2.11Definao procedimentomax3 querecebetrêsnúmeroscomoargumentosedevolveo maiordeles.

Exercício2.12(Livro — 1.3) Definaum procedimento querecebetrêsnúmeroscomoargumentos e devolve asomadosquadradosdosdoismaiores.

Exercício2.13(Livro — 1.4)Reparequeo nossomodelodeavaliaçãopermiteaexistênciadecombinaçõescu-jos operadoressãoexpressõescompostas.Useestaobservaçãoparadescrever o comportamentodoseguinteprocedimento:

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

Exercício2.14Suponhaquea temo valor5. Digaqualo valor resultantedaavaliaçãodaexpressão:

Page 8: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

2 PROCEDIMENTOSCOMPOSTOS 6

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

(+ a b))

Exercício2.15Qual é o valor resultanteda avaliaçãoda expressãoque se segue? Reescreva estaexpressãoutilizandoumaexpressãolambda.

(let ((x 5))(let ((x 3)

(y (* x 2)))(+ x y)))

Exercício2.16Avalieaexpressãoquesesegue.Reescreva-autilizandoa formaespeciallet .

((lambda (x)(+ x ((lambda (x)

(* 2 x))3)))

2)

Exercício2.17Considereaseguinteexpressãomatemática:

��JLK���� � JLKM�N�1. Escrevaum procedimento calc-expr quecalculeo seuvalor.

2. Usandoa estrutura de blocos, garantaqueo seuprocedimentorecebesempreum argu-mentocorrecto(

JPO�Q).

3. Comenteasafirmaçõesseguintes:

(a) Nestecaso,nãohavia necessidadedeutilizar aestruturadeblocos.

(b) Nestecaso,convémutilizar a formaespeciallet .

(c) Nestecaso,nãodevo definir o procedimentocubo .

(d) O procedimentocubo , se for definido, deve ser definido dentrodo procedimentocalc-expr .

Exercício2.18O númerodecombinaçõesde

DobjectosR a R podesercalculadopelaseguintefunção:

S)T D H � D A R � +

seRE+ Q AseRE+ D AS)T D H � D>�U A R ��� SVT D H � DW�U A R �U�� seDYX R ,

DZX[Qe R X[Q C

Page 9: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

2 PROCEDIMENTOSCOMPOSTOS 7

1. Escrevaumprocedimento quecalculao númerodecombinaçõesdeD

objectosR a R . Usea estruturadeblocosparagarantirqueo seuprocedimentorecebesempreosargumentoscorrectos:inteirossuperioresou iguaisazeroe

DYO R .

2. Sabendoqueexistem49númerospossíveisparao totoloto equecadachavetem6 númerosdiferentes,calculeo númerodechavesexistentes.

3. Sabendoquecadaapostacusta40$00,quantodinheiro teriaquegastarparater a certezaqueganhavaumprimeiroprémio?

Exercício2.19Definao procedimentofactorial querecebeum númerocomoargumentoe calculao facto-rial dessenúmero.NotequeR K +�R]\ � R �U��(K e Q�K + .

Exercício2.20Modifiqueo procedimentoanteriorparaque,nocasode R sernegativo, o factorialdevolvazero.Notequeessetestesódeveserfeito umavez.

Exercício2.21Defina um procedimento que calculauma potênciainteira de

J. Note que

J_^ + J=`aJb^�c 8eJ ; +

.

Exercício2.22Modifique o procedimentoanteriorparaquepassetambéma conseguir calcularpotênciasemqueo expoenteénegativo. Noteque

Jdc�^ + 8e f .

Exercício2.23Modifique o procedimentoanteriorparaquepassea tratarcorrectamenteos casos

Q ^, com R

negativo eQ ; .

Exercício2.24Consideredefinidosos seguintesprocedimentos:add1 , sub1 e zero? , que somamum aoseuargumento, subtraemum ao seuargumento,ou testamseo seuargumentoé igual a zero,respectivamente.Com baseneles(ou seja,semutilizar procedimentoscomo

�,�

,`,�, + , g ,

X), definaos

seguintesprocedimentos:

1. O procedimentosoma, querecebedoisinteirossuperioresouiguaisazerox ey , ecalculaasomaentreeles.

2. O procedimento igual? , quedadosdoisinteirossuperioresouiguaisazerox ey , retornaverdadeiroseelesforemiguaise falsocasocontrário.

3. O procedimentomenor? , quedadosdoisinteirossuperioresou iguaisazerox ey , indicasex émenorquey .

Page 10: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

2 PROCEDIMENTOSCOMPOSTOS 8

4. O procedimentodiferenca , quecalculaa diferençaentredois inteiros superioresouiguaisazerox ey .

5. O procedimentoproduto , quecalculao produto entredois inteiros superioresou iguaisazerox ey . Paradefinir esteprocedimento podetambémusaro procedimentosoma.

6. O procedimentodivisao-inteira , que calculaa divisão inteira entredois inteirospositivos

Je h . A divisãointeiraentre

Je h é o máximointeiro i tal que ij\khml J . Para

definir esteprocedimentopodeusarosprocedimentosdiferenca emenor? .

Exercício2.25(AdaptadodoLivro — 1.6)A Alice nãopercebeporqueéqueo if precisadeserumaformaes-pecial.“Porqueéquenãoo possodefinir comoumprocedimentonormal emtermosdocond ?”perguntaela.Eva,umaamigasua,diz queissoépossível edefineumanovaversãodo if :

(define (new-if predicate then-clause else-clause)(cond (predicate then-clause)

(else else-clause)))

A Evademonstrao programaàAlice:

(new-if (= 2 3) 0 5)5

(new-if (= 1 1) 0 5)0

Encantada,aAlice usao new-if parare-escrevero procedimentoquecalculaapotência:

(define (potencia base exp)(new-if (= exp 0)

1(* base (potencia base (- exp 1)))))

O queéqueacontecequandoaAlice tentacalcularpotências?Explique.

Exercício2.26(Livro — 1.15)O senode um ângulo(especificadoem radianos)podesercalculadousandoaaproximaçãosin

JPn�JseJ

for suficientementepequeno,ea identidadetrigonométrica

sinJ + � sin

J� ��� sin

� J �parareduziro valor do argumentodesin. (Paraesteexercício,vamosconsiderarqueum ânguloé “suficientementepequeno”seasuamagnitudenãofor maiorque0.1radianos.)Estasideiasestãoincorporadasnosprocedimentosseguintes:

Page 11: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

2 PROCEDIMENTOSCOMPOSTOS 9

(define (cube x)(* x x x))

(define (sine angle)(define (p x)

(- (* 3 x)(* 4 (cube x))))

(if (<= (abs angle) 0.1)angle(p (sine (/ angle 3)))))

1. Quantasvezeséqueo procedimentop éaplicadoquandoavaliamos(sine 12.5) ?

2. Qual é a ordemde crescimentoem espaçoe númerode passos(em funçãode 1 ) usadospeloprocessogeradopeloprocedimentosine quandoavaliamos(sine a) ?

Exercício2.27Considereumaversãodo jogo do NIM emquedoisjogadoresjogamalternadamente.No iníciodojogoexisteumasériedepalitos.Emcadajogada,cadajogadorpoderemover1,2 ou3 palitos.Quemremovero último palitoganhao jogo.DefinaosseguintesprocedimentosparacriarumprogramaquejogaaoNIM:

1. O procedimentoganha? , querecebecomoargumentoo númerode palitosaindaexis-tentes. Esteprocedimentodeve devolver o valor lógico verdadeiroseo jogadorquevaijogar agorapodeganharo jogo sejogar damelhorforma possível, e falsocasocontrário.Sugestão:utili zeo procedimentoperde? daalíneaseguinte.

2. O procedimentoperde? , querecebecomoargumentoo númerode palitosaindaexis-tentes. Esteprocedimentodeve devolver o valor lógico verdadeiroseo jogadorquevaijogar agoravai perdero jogo seo adversáriojogar damelhorforma possível, e falsocasocontrário.Sugestão:utili zeo procedimentoganha? .

3. O procedimentonim , querecebecomoargumentoo númerodepalitosaindaexistentesedevolveo númerodepalitosqueo jogadorajogarnessasituaçãodeveremoverparaganharo jogo. Sugestão:utilize o procedimentoperde? .

Page 12: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

3 PROCESSOSGERADOSPORPROCEDIMENTOS 10

3 Processosgeradospor procedimentos

Exercício3.1(AdaptadodoLivro — 1.9)Cadaumdosseguintesprocedimentosdefineummétodoparaadicio-nardoisinteirospositivosemtermosdosprocedimentosadd1 , queincrementao seuargumentodeumaunidade,esub1 , quedecrementao seuargumentodeumaunidade.

(define (soma a b) (define (soma a b)(if (zero? a) (if (zero? a)

b b(add1 (soma (sub1 a) b)))) (soma (sub1 a) (add1 b))))

Usandoo modeloda substituição,ilustre o processogeradopor cadaprocedimento ao avaliar(soma 4 5) . Estesprocessossãoiterativosou recursivos?Porquê?

Exercício3.2Paracadaumdosseguintesprocedimentos,quegeramprocessosrecursivos,definanovasversõesdosprocedimentosquegeremprocessositerativos.

1. (define (produto x y)(if (zero? x)

0(+ y (produto (- x 1) y))))

2. (define (div x y)(if (< x y)

0(+ 1 (div (- x y) y))))

Exercício3.3Utilizandoosprocedimentoszero? e sub1 , definao procedimentopar? , queverificaseumnúmerointeirosuperiorou igualazeroéparounão.

1. Usandoum processorecursivo

2. Usandoum processoiterativo

Exercício3.4Definaum procedimento quecalculaumapotênciainteira de

Jusandoum processoiterativo.

NotequeJb^ + J5`oJ_^�c 8 e

J ; + .Exercício3.5Escrevaum procedimentoparacalcularo valorde

Fqp R � J�� utilizandoaexpansãoemsérie:

Fqp R � J�� +J�K �

J_���K �

J_r��K �

Jts �K � C C.C

Page 13: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

3 PROCESSOSGERADOSPORPROCEDIMENTOS 11

1. Usandoum processorecursivo

2. Usandoum processoiterativo

Assumaquejá existemos procedimentos fact e pot quecalculamo factoriale a potência,respectivamente.O seuprocedimento deve receber, paraalémdo valor emradianosparao qualquercalcularo seno,o númerodetermosquedevemserconsiderados.

Exercício3.6Definaum procedimentoparacalcularaproximaçõesde

-, usandoa fórmula

-� +

���������������! C C.C������������ �� C C.C

O procedimentodeve recebero númerodetermosautilizar paracalcularaaproximação.

1. Usandoum processorecursivo

2. Usandoum processoiterativo

Exercício3.7Considereo seguinteprocedimento:

(define (misterio x n)(if (= n 0)

0(+ (* x n)(misterio x (- n 1)))))

1. Mostreaevoluçãodoprocessogeradopelaavaliaçãode(misterio 2 3) .

2. O procedimentoapresentadoéumprocedimento recursivo? Justifique.

3. O procedimentoapresentadogeraum processorecursivo ou iterativo? Justifique.

4. Seo procedimentogeradoé recursivo (iterativo), transformeo procedimentode forma aquegereum processoiterativo (recursivo).

Exercício3.8Consideredefinidosos seguintesprocedimentos:add1 , sub1 e zero? , que somamum aoseuargumento, subtraemum ao seuargumento,ou testamseo seuargumentoé igual a zero,respectivamente.Com baseneles(ou seja,semutilizar procedimentoscomo

�,�

,`,�, + , g ,

X), definaos

seguintesprocedimentos:

1. Definao predicadopositivo?+ querecebeum númeroqualquer(positivo ou negativo)e indicaseeleépositivo.

2. Definao procedimento simetrico querecebeum númeroqualquer(positivo ou negati-vo) edevolveo simétricodessenúmero.

Page 14: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

3 PROCESSOSGERADOSPORPROCEDIMENTOS 12

3. Definao testedeigualdadededoisnúmerosquaisquer(positivos ounegativos).

4. Definao procedimentodivisao-inteira-positiva , quecalculaa divisãointeiraentredois inteirospositivos

Je h . A divisãointeiraentre

Je h é o máximointeiro i tal

que i$\khPl J . Paradefinir esteprocedimentopodeusarosprocedimentosdiferencaemenor? .

5. Definao procedimentodivisao-inteira quecalculaa divisãointeiraentredoisnú-merosquaisquer(positivosounegativos).

Exercício3.9Escreva um procedimentoparacalculara somadosdígitosdeum númeronatural.Porexemplo,(soma-digitos 12345) temo valor 15 . Utili zeosprocedimentosprimitivosquotiente remainder , quecalculam,respectivamente,a divisãointeiraentredoisnúmerose o restodadivisãointeiraentredoisnúmeros.

Exercício3.10Escreva um procedimentocapazdeescrever no ecrãa sériedosnúmerospares.O procedimentodeve recebero númerode termosda série. A forma especialdisplay permiteescrever parao ecrã. Reescreva o procedimento de modo a passara escrever no ecrãa sériedos númerosímpares.

Exercício3.11Escreva um procedimentoque recebeum inteiro positivo e devolve um inteiro que é apenasconstituídopelosdígitos ímpares do númerooriginal. Por exemplo, (digitos-impares1266458) tem o valor 15 . Utili ze os procedimentosprimitivos quotient e remainder ,quecalculam,respectivamente,a divisãointeiraentredoisnúmerose o restodadivisãointeiraentredois números.Assumaqueo inteiro fornecidoa esteprocedimento tem pelo menosumdígito ímpar.

Exercício3.12O espelhode um númeroé o resultadode invertera ordemde todosos seusalgarismos. Porexemplo,o espelhode 123 é 321 e o espelhode 45678é 87654. Utilizando os procedimentosprimitivos quotient e remainder , escreva em Schemeum procedimento que recebeumnúmerointeiroecalculao seuespelho.O seuprocedimentosnãotemdeverificarseo argumentorecebidoéum númerointeiro.

Page 15: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

4 PROCEDIMENTOSDE ORDEMSUPERIOR 13

4 Procedimentosdeordem superior

Exercício4.1Diga qualo resultadodeavaliar cadaumadasseguintesformas.Considerequeestassãoforne-cidasaoavaliadordeSchemepelaordemapresentada(econsequentementecadaformaédepen-dentedasanteriores).Seaavaliaçãodeumaformanãoproduzirnada,escrevanada.

((lambda (x)(+ x ((lambda (x) (+ 2 x)) 3))) 2)

((lambda (f x y)(+ x y)) * 2 3)

((lambda (* + x y z)(* x (+ y z))) + * 1 2 3)

((lambda (x)((lambda (y)(* y 2))(+ x 3))) 4)

(define a 8)

((lambda (op)(op a)) odd?)

((lambda (op a)(op a)) odd? 9)

Exercício4.2EscrevaemSchemeumprocedimentoanónimoquerecebeumprocedimentoeumnúmeroequedevolveo resultadodeaplicaro procedimento aoquadradodonúmero.O seuprocedimento nãotemdeverificarseo argumentorecebidoéumnúmero.

Exercício4.3Definaum procedimento deordemsuperiorquerecebeprocedimentosparacalcularasfunçõesreaisdevariável realf(x) eg(x)equesecomportacomoaseguintefunçãomatemática:

: � JL� +�u � J��N����� ? � J��N�Considerequeosprocedimentosquadrado ecubo já estãodefinidos:

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

(define (cubo x)(* x x x))

Exercício4.4Escreva um procedimentoem Schemechamadosoma-fun querecebecomoargumentodoisprocedimentos correspondentesa funçõesreaisdevariável real,fun1 e fun2 e devolve o pro-cedimentocorrespondenteàfunçãoqueresultadesomarfun1 e fun2 . Porexemplo,definindo:

Page 16: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

4 PROCEDIMENTOSDE ORDEMSUPERIOR 14

(define (f1 x)(+ x 3))

(define (f2 y)(* y 10))

então((soma-fun f1 f2) 12) temo valor135 .

Exercício4.5Consideredefinidoo procedimentosum:

(define (sum term a next b)(if (> a b)

0(+ (term a)

(sum term (next a) next b))))

Digao quefazemasseguinteschamadasaesseprocedimento:

1. (sum (lambda (x) x) 4 add1 500)

2. (sum (lambda (x) (sqrt x)) 5 (lambda (x) (+ x 5)) 500)

3. (sum (lambda (x) (sum (lambda (x) x) 1 add1 x)) 1 add1 5)

Exercício4.6(Livro — 1.30)O procedimentosum apresentadoacimagerarecursãolinear. No entanto,podeserescritode forma a gerarum processoiterativo. Mostrecomoé que issopoderiaser feitopreenchendoasexpressõesquefaltamnadefiniçãoquesesegue:

(define (sum term a next b)(define (iter a result)

(if <??><??>(iter <??> <??>)))

(iter <??> <??>))

Exercício4.7Combaseno procedimentosum, escreva um procedimento paracalcularo valor de

Fqp R � J�� uti-lizandoaexpansãoemsérie:

Fqp R � J�� +J�K �

J ���K �

J r��K �

J s �K � C C.C

Assumaquejá existemos procedimentos fact e pot quecalculamo factoriale a potência,respectivamente.O seuprocedimentodeve receber, paraalémde

J, o númeroR determosque

devemserconsiderados.

Exercício4.8(Livro — 1.31)

Page 17: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

4 PROCEDIMENTOSDE ORDEMSUPERIOR 15

1. O procedimentosum é apenaso maissimplesdeum vastonúmerodeabstracçõesseme-lhantes,quepodemsercapturadascomoprocedimentosde ordemsuperior. Escreva umprocedimentoanálogochamadoproduct , queretornao produtodosvaloresdeumafun-ção parapontospertencentesa um intervalo. Mostre como definir o factorial emtermosdo product . Usetambémo product paracalcularaproximaçõesde

-usando

a fórmula -� +

�������v��������! C.C.C�������v����� �� C.C.C

2. Seo seuprocedimento product gerarum processorecursivo, escreva um quegereumprocessoiterativo. Segerarumprocessoiterativo, escrevaumquegereumprocessorecur-sivo.

Exercício4.9(Livro — 1.32)

1. Mostrequesum e product sãoamboscasosespeciaisde umanoçãoaindamaisgeralchamadaaccumulate , que combinauma coleçãode termos,usandouma funçãodeacumulaçãogeral:

(accumulate combiner null-value term a next b)

Accumulate recebecomoargumentos o mesmoterm e asmesmasespecificaçõesdointervaloa eb, bemcomoumprocedimentocombiner (de2 argumentos)queespecificacomoé queo termocorrentedeve sercombinadocom a acumulaçãodostermosprece-dentese um null-value , queespecifica qualo valor a usarquandoostermosacabam.Escrevao procedimentoaccumulate emostrecomoéquesum eproduct podemserdefinidoscomosimpleschamadasaaccumulate .

2. Seo seuprocedimentoaccumulate gerarum processorecursivo, escreva um quegereum processoiterativo. Segerarum processoiterativo, escreva um quegereum processorecursivo.

Exercício4.10Considereasseguintesdefiniçõesparaumprocedimentoquedevolveaprimeiraderivadadeumafunção:

(define dx 0.00001)

(define (deriv f)(lambda (x)

(/ (- (f (+ x dx))(f x)) dx)))

Com basenasdefiniçõesanteriores,escreva um procedimento que recebeuma funçãoe uminteiro R (R Ow

) e devolve a drivadade ordem R da função. Utilize o procedimentoderiv .Nota: aderivadadeordemR deumafunçãoéaderivadadaderivadadeordemR �� .Exercício4.11(Livro — 1.34)Suponhaquedefinimoso procedimento

Page 18: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

4 PROCEDIMENTOSDE ORDEMSUPERIOR 16

(define (f g)(g 2))

Assim,temos:

(f quadrado)4

(f (lambda (z) (* z (+ z 1))))6

O queacontecese(perversamente)pedirmosaointerpretadorparaavaliar (f f) ? Explique.

Exercício4.12A conversãode valoresé uma operaçãocomumem programação.Por exemplo, convertem-setemperaturasemgrausFarenheitparagrausCentígrados,horaslocaisemLisboaparahoraslocaisemNova Iorque,etc.

1. Escreva um procedimento em Schemechamadoconverte querecebeo procedimentocorrespondenteà funçãodeconversãoe o valor a convertere devolve o valor convertido.Porexemplo,seFar-Cent for o procedimentocorrespondenteà funçãodeconversãodegrausFarenheitemCentígradosdefinidocomo

(define (Far-Cent f)(/ (* 5 (- f 32)) 9))

aavaliaçãode(converte Far-Cent 32) temo valor0.

2. EscrevaumprocedimentochamadoLis-NY paraconverterumahoralocalemLisboa(umnúmerointeiroentre0 e23)paraahoralocalemNovaIorque(ondesãomenoscincohorasdoqueemLisboa).Tenhacuidadocomapassagemdameianoite.Utilize o procedimentoconverte da alíneaanteriore o procedimento Lis-NY paramostrarqual a hora emNova Iorquequandosão3 damanhãemLisboa.

Exercício4.13Suponhaque f é um procedimento em Schemequecorrespondeà realizaçãode uma funçãoestritamentecrescentede númerosnaturaisparanúmerosnaturais.Por exemplo, f podeseroprocedimentoquadrado quetem,entreoutros,osseguintesvalores:

n 1 2 3 4 5 6 7 8 9 10(f n) 1 4 9 16 25 36 49 64 81 100

EscrevaumprocedimentoemSchemechamadoprocura querecebecomoargumentoso proce-dimentof , um valor objectivo e doisvaloresinicial e final , pertencentesaodomíniode f , e determinaseo valor objectivo seencontraentrea sequênciade valores(f ini-cial)

� � �(f final) . No casodeesteseencontrar, o valor do procedimentoprocura é

x tal que(f x) = objectivo , emcasocontrárioo valor do procedimentoprocura é 0.Por exemplo,(procura quadrado 25 1 10) tem o valor 5 e (procura quadrado12 1 10) temo valor 0. Utilize umatécnicasemelhanteà utilizadano cálculoderaízespelométododo intervalo.

Page 19: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

4 PROCEDIMENTOSDE ORDEMSUPERIOR 17

Exercício4.14Escreva o procedimento conjuncao , que recebedois predicadosde um argumentocada,edevolve um novo predicadodeum argumentoqueverificaseesseargumentosatisfazambosospredicadosrecebidosoriginalmente.Porexemplo,

> (define par>5? (conjuncao even? (lambda (x)(> x 5))))> (par>5? 4)#f> (par>5? 8)#t> (par>5? 9)#f

Exercício4.15Definaumprocedimentocurry querecebedoisargumentos.O primeiro argumentodeveserumprocedimentodedoisargumentos.O procedimentocurry deve retornarum procedimentodemodoa quea expressão((curry p x) y) produzao mesmoresultadoque(p x y) . Ouseja,o valor retornadoé um procedimentodeum argumentoquecorrespondeaoprocedimentorecebidocomo seuprimeiro argumentofixo, sendoigual aosegundoargumentorecebidopeloprocedimentocurry ).

Exercício4.16Utilizandoo procedimentocurry doexercício4.15,definaosseguintesprocedimentos:

1. O procedimentoadd1 .

2. O procedimentotriplo quecalculao triplo deumnúmero.

3. O procedimento potencia-de-2 querecebeum númeroR e calculao valor de�@^

(sa-bendoqueexistedefinidoemSchemeo procedimentoexpt quecalculaapotênciadeumnúmeroaumdeterminadoexpoente).

Exercício4.17Utilizandoa definiçãodo procedimentocurry do exercício4.15,expliquequeresultadospro-duzemasseguintesexpressões:

1. (curry curry +)

2. (curry curry curry)

Exercício4.18Considereaseguinteexpressão:

((((p 1) 2) 3 4) 5)

1. O quepodeconcluiracercadep edecadaumadassub-expressõesdaexpressãoacima?

2. Definap de forma a quea avaliaçãoda expressãoacimaproduzao resultadode somartodososnúmeros,ouseja,15.

Page 20: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

4 PROCEDIMENTOSDE ORDEMSUPERIOR 18

Exercício4.19(Livro — 1.41)Definaum procedimento querecebecomoargumentoum procedimentodeumargumentoe retornaum procedimentoqueaplicaduasvezeso procedimentooriginal.Porexemplo,seadd1 for um procedimentoqueadiciona1 aoseuargumento, então(doubleadd1) deveráserum procedimentoqueadicionadois:

((double add1) 5)7(((double double) add1) 5)9

Qualéo valor retornadopor (((double (double double)) add1) 5) ? Porquê?

Exercício4.20(Livro — 1.42)Sejamu e ? duasfunçõesdeumargumento.A composiçãou depoisde ? édefi-nidacomosendoa função

JExy u � ? � JL�(� . Definaum procedimentocompose queimplementaacomposição.Porexemplo,seinc for um procedimentoqueadiciona1 aoseuargumento,

((compose square inc) 6)49

Exercício4.21(Livro — 1.43) Se u for uma funçãonuméricae R um inteiro positivo, entãopodemosfor-mar a R -ésimarepetiçãoda aplicaçãode u , queé definidacomoa funçãocujo valor em

Jéu � u � C C.C � u � JL�(� C.C C �'� .

Porexemplo,se u for afunçãoJPxyzJ{�E

, entãoa R -ésimarepetiçãodaaplicaçãode u éafunçãoJPxyzJ|� R .Se u for a operaçãodeelevar um númeroaoquadrado,entãoa R -ésimarepetiçãodaaplicaçãode u éa funçãoqueelevao seuargumentoa

� ^.

Escrevaumprocedimentochamadorepeated , querecebecomoargumentosumprocedimentoquecalculau euminteiropositivo R eretornaumprocedimentoquecalculaa R -ésimarepetiçãodaaplicaçãode u . O seuprocedimentodeverápoderserusadodaseguinteforma:

((repeated square 2) 5)625

Sugestão:Podeserconvenienteusaro compose doexercícioanterior.

Exercício4.22(Livro — 1.44) A ideia de alisarumafunçãoé um conceitoimportanteem processamentodesinal.Se u éumafunçãoe i J éumnúmeropequeno,entãoaversãoalisadade u éafunçãocujovalornoponto

Jéamédiade u � J5� i JL� , u � JL� e u � J|� i J�� .

Escrevaumprocedimento smooth querecebecomoargumentoumprocedimentoquecalculaue retornaumprocedimentoquecalcula u alisada.Algumasvezes,podeserútil alisarrepetidamente umafunção(isto é, alisara funçãoalisadaeassimsucessivamente)paraobtera funçãoalisadan-vezes.Mostrecomoé quepoderiagerarafunçãoalisadan-vezesdequalquerfunçãousandosmooth e repeated doexercícioanterior.

Page 21: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

4 PROCEDIMENTOSDE ORDEMSUPERIOR 19

Exercício4.23Escreva em Schemeum procedimentochamadorasto , querecebeumacadeiade caracterescorrespondendoao nomede um procedimento,e um procedimentode um argumento. O pro-cedimentorasto retornaum procedimento deum argumentoqueescreve no ecrãa indicaçãodequeo procedimentofoi chamadoe o valor do seuargumento,escreve o resultadodeavaliaro procedimentoe devolve o valor deaplicaro procedimento original aoargumentorecebido.Oseuprocedimentonãodevecalcularvaloresduplicados.Porexemplo,

> (define traced-sqrt (rasto "sqrt" sqrt))> (traced-sqrt 4)Chamada a sqrt, com o argumento 4Valor de (sqrt 4) 22

Page 22: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

5 TIPOSABSTRACTOSDE INFORMAÇÃO 20

5 TiposAbstractosde Inf ormação

Exercício5.1Digaqualo resultadodeavaliarcadaumadasseguintesexpressões.Sealgumadelasderorigemaum erro,expliqueporquê.

(cons 2 3)

(car (cons 2 3))

(cddr (cons 2 3))

(cdr (cons "ola" "bom dia"))

(cdr (cons 2 3))

(cons (integer? (sqrt 4)) (integer? 2.0))

(pair? (cons 2 3))

(cons (cons 1 2) (cons 3 4))

Exercício5.2Representeos seguintesparesusandoa notaçãode caixase ponteiros. Diga como consegueconstruiressesparesusandoo procedimentocons :

1. (1 . 2)

2. (1 . (2 . (3 . (4 . 5))))

3. (1 . (2 . 3))

Exercício5.3Digaqualo resultadodeavaliarcadaumadasseguintesexpressões.Sealgumadelasderorigemaum erro,expliqueporquê.

(list 1 2 3)

(list (cons 1 3) 4)

(rest (list 2 3))

(first (rest (list 2 3)))

(rest (rest (list 2 3)))

()

Page 23: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

5 TIPOSABSTRACTOSDE INFORMAÇÃO 21

(list ())

(list)

(list? (cons 2 3))

(list? (cons 2 ()))

(list? (list 2 3))

(pair? (list 2 3 4))

(null? (list 1 2))

(null? ())

(null? (list ()))

Exercício5.4Representeasseguinteslistasusandoanotaçãodecaixaseponteiros:

1. (1)

2. (1 2)

3. (1 (2 (3 (4 5))))

4. (1 (2 . 3) 4)

5. (((2 (6 (7 . 8) 3)) 1))

6. (1 (((2))))

Exercício5.5(Livro — 2.24)Suponhaqueavaliamosa expressão(list 1 (list 2 (list 3 4))) .Mostreo resultadoimpressopelointerpretador, aestruturadecaixaseponteiroscorrespondente.

Exercício5.6(Livro — 2.25)Apresentecombinaçõesde first s e rest s queseleccionemo 7 decadaumadaslistasseguintes:

(1 3 (5 7) 9)

((7))

(1 (2 (3 (4 (5 (6 7))))))

Page 24: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

5 TIPOSABSTRACTOSDE INFORMAÇÃO 22

Exercício5.7(Livro — 2.26)Suponhaquedefinimosx ey comosendoduaslistas:

(define x (list 1 2 3))

(define y (list 4 5 6))

Qualé o resultadoimpressopelo interpretadorcomorespostaa cadaumadasseguintesexpres-sões?

(append x y)

(cons x y)

(list x y)

Exercício5.8(Livro — exemplodaspáginas143-4)Considerequeforamfeitasasdefinições:

(define a 1)(define b 2)

Digaqualo valordecadaumadasseguintesexpressões:

(list a b)(list ’a ’b)(list ’a b)(first ’(a b c))(rest ’(a b c))

Exercício5.9Suponhaque desejava criar o Tipo Abstractode Informação(TAI) Racional em Scheme.Podemosconsiderarasseguintesoperaçõesbásicasparaosnúmerosracionais:

� Construtor

– cria-racional: Natural x Naturaly

Racional

Recebedoisvaloresnaturais,J

e h , edevolveo númeroracionalJL� h .

� Selectores

– numerador: Racionaly

Natural

Recebeum racionaledevolveo valordoseunumerador.

– denominador: Racionaly

Natural

Recebeum racionaledevolveo valordoseudenominador.

� Reconhecedor

– racional?: Universaly

Lógico

Recebequalquerobjectoedevolveverdadeiroseo objectofor umracional.

Page 25: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

5 TIPOSABSTRACTOSDE INFORMAÇÃO 23

� Teste

– racional=?: Racional x Racionaly

Lógico

Recebedoisracionaisedevolveverdadeiroseosobjectosforemiguais.

1. Escolhaumarepresentaçãoparao tipo Racional.

2. EscrevaemSchemeasoperaçõesbásicascombasenarepresentaçãoescolhida.

3. Escrevaosseguintesprocedimentosdealtonível, assimcomoassuasassinaturas:

(a) Procedimentoparamultiplicar dois racionais.O produtodosracionais1 � H e } � i édadopeloracional

� 1 � } ��� � H � i � .(b) Procedimentoparasomardoisracionais.A somadosracionais1 � H e } � i édadapelo

racional� 1 � i � } � H ��� � H � i � .

4. Suponhaquequeriaalterara representaçãousada,de modoa guardaro númeroracionalde forma normalizada(por exemplo,

�����seriaguardadocom

�����). Quealteraçõestem

de fazeràsdefiniçõesanteriores?Sugestão:useo procedimento gcd (greatestcommondivisor).

5. (Livro — 2.1) Definaumanova versãodecria-racional queconsidereargumentospositivosenegativos,devendoanovaversãonormalizarosinal,deformaaqueseonúmeroracionalfor positivo, tantoo numeradorcomoo denominadorsãopositivos;eseo númeroracionalfor negativo, sóo numeradoréqueénegativo.

Exercício5.10Um conjuntoé um aglomeradodeobjectos,emquenãoexistemobjectosduplicadose emqueasuaordemnãoé relevante.As operaçõesquemanipulamo tipo Conjunto são:

� Construtores

– conjunto-vazio:y

Conjunto

Cria umconjuntovazio.

– cria-conjunto: Natural x Conjuntoy

Conjunto

Cria umconjuntoqueresultadejuntaro novo elementoaoconjuntojá existente.

� Selectores

– da-elemento: Conjuntoy

Natural

Recebeum conjuntoe devolve o valor de um elementodo conjuntoou erro casooconjuntosejavazio.

– da-conjunto-restante: Conjuntoy

Conjunto

Recebeumconjuntoedevolveoconjuntosemoelementodevolvidoporda-elemento .

� Reconhecedores

– conjunto?: Universaly

Lógico

Recebequalquerobjectoedevolveverdadeiroseo objectofor umconjunto.

Page 26: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

5 TIPOSABSTRACTOSDE INFORMAÇÃO 24

– conjunto-vazio?: Conjuntoy

Lógico

Recebeum conjuntoedevolveverdadeirosefor um conjuntovazio.

– e-elemento-do-conjunto?: Natural x Conjuntoy

Lógico

Recebeum naturale um conjuntoe devolve verdadeiroseo naturalfor um elementodoconjunto.

� Teste

– conjunto=?: Conjunto x Conjuntoy

Lógico

Recebedois conjuntose devolve verdadeiroseamboscontiveremos mesmosele-mentos.

1. EscolhaumarepresentaçãoparaesteTAI.

2. EscrevaemSchemeasoperaçõesbásicascombasenarepresentaçãoescolhida.

3. Respeitandoasbarreirasdeabstracção,implementeasseguintesoperações:

(a) uniao-conjuntos: Conjunto x Conjuntoy

Conjunto

Devolveo conjuntoqueresultadauniãodosdoisconjuntos recebidos.

(b) interseccao-conjuntos: Conjunto x Conjuntoy

Conjunto

Devolveo conjuntoqueresultadaintersecçãodosdoisconjuntosrecebidos.

(c) numero-elementos-conjunto: Conjuntoy

Natural

Devolveo númerodeelementosdoconjuntorecebido.

Exercício5.11Suponhaquedesejava criar o tipo Vector emScheme.Um vectornumreferencialcartesianopodeser representadopelascoordenadasda suaextremidade

� J A h � , estandoa suaorigem noponto

� Q A Q��. Podemosconsiderarasseguintesoperaçõesbásicas:

� Construtor

– cria-vector: Real x Realy

Vector

Recebedoisvaloresreais(J

e h ) ecriaumvectorcujaextremidadeéo ponto� J A h � .

� Selectores

– abcissa: Vectory

Real

Recebeum vectoredevolveo valordasuaabcissa.

– ordenada: Vectory

Real

Recebeum vectoredevolveo valordasuaordenada.

1. Escolhaumarepresentaçãoparao tipo Vector.

2. EscrevaemSchemeasoperaçõesbásicascombasenarepresentaçãoescolhida.

3. Escrevaosseguintesprocedimentosdealtonível, assimcomoassuasassinaturas:

Page 27: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

5 TIPOSABSTRACTOSDE INFORMAÇÃO 25

(a) Procedimentoparasomardois vectores.A somadosvectoresrepresentadospelospontos

� 1 A H � e� } A i � édadapelovector

� 1 � H A } � i � .(b) Procedimentoparacalcularo produtoescalardedoisvectores.O produtoescalardos

vectoresrepresentadospelospontos� 1 A H � e

� } A i � édadapeloreal 1 � H � } � i .

Exercício5.12Considereo problemaderepresentarrectângulosnumplano,emqueosrectângulossãosempreparalelosaoseixos. Cadarectângulopodeserrepresentadopor um par devectores(um repre-sentandoo cantoinferior esquerdoeoutroo cantosuperiordireito).

1. Definaasoperaçõesbásicasparao TAI Rectângulo(construtore selectores),combasenoTAI Vector.

2. Escolhaumarepresentação(emScheme)parao tipo Rectângulo.

3. EscrevaemSchemeasoperaçõesbásicascombasenarepresentaçãoescolhida.

4. Definaprocedimentosquecalculamo perímetro eaáreadeum rectângulo.

5. Escrevaumprocedimentodentro-rectangulo querecebeumrectânguloeumpontoesódevolveverdadeiroseo pontoestiverdentrodo rectângulo(incluindoa fronteira).

Exercício5.13Considerequefoi definidoo tipo árvorebinária.Paraestetipo, estãodefinidasasoperações:

� arvore-vazia queconstróiumaárvorevazia.

� constroi-arvore querecebea raiz, a árvoreesquerdae a árvore direitae constróiaárvorecorrespondente.

� arvore-raiz querecebeumaárvorebináriae retornaasuaraiz.

� arvore-esquerda querecebeumaárvorebináriae retornaasuaárvoreesquerda.

� arvore-direita querecebeumaárvorebináriae retornaasuaárvoredireita.

� arvore-vazia? querecebeumobjectoe retornaverdadeiroseelecorresponderaumaárvorevaziae falsocasocontrário.

1. Especifiqueformalmenteestasoperações,e classifique-asemconstrutores,selectores,re-conhecedorese testes.

2. Combasenasoperaçõesdescritas,escreva osseguintesprocedimentosparapercorrerár-voresbinárias:

(a) percorre-inorder recebeumaárvorebináriae retornaumalista comtodasassuafolhas,percorrendoprimeiro a árvore esquerda,depoisa raiz e depoisa árvoredireitadaárvoreinicial.

(b) percorre-preorder recebeumaárvorebináriae retornaumalistacomtodasassuafolhas,percorrendoprimeiro a raíz, depoisa árvore esquerdae depoisa árvoredireitadaárvoreinicial.

Page 28: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

5 TIPOSABSTRACTOSDE INFORMAÇÃO 26

(c) percorre-posorder recebeumaárvorebináriae retornaumalistacomtodasassuafolhas,percorrendoprimeiro aárvoreesquerda,depoisaárvoredireitaedepoisaraizdaárvore inicial.

Exercício5.14Definaosseguintesprocedimentosqueoperamsobrelistas. Osseusprocedimentosdevemdarerro(usandoo error ) quandoissosejustificar. Quandofor possível, escrevadoisprocedimen-tos,um quegeraum processorecursivo eoutroquegeraumprocessoiterativo.

1. O procedimento primeiro-par que recebeuma lista e retornaum par com os doisprimeiroselementosdalista.

2. O procedimento maior-elemento querecebeumalista de inteirose retornao maiorelementodessalista.

3. O procedimentosoma-elementos querecebeumalista e retornaa somade todososelementosdessalista.

4. O procedimentoimprime-lista-de-pares querecebeumalistadepareseimprimeospares,um por linha. O seuprocedimentodeve assinalarquandoé quechega aofim dalista. Porexemplo,

(imprime-lista-de-pares (list (cons "Luisa" 12345678)(cons "Jorge" 23456789)(cons "Maria" 34567890)(cons "Rui" 45678901)))

Deveráimprimir

Luisa -> 12345678Jorge -> 23456789Maria -> 34567890Rui -> 45678901Fim da lista

Exercício5.15(Livro — 2.17)Definaum procedimentolast-pair , queretornaa lista quecontémapenasoúltimo elementodeumadadalistanãovazia:

>(last-pair (list 23 72 149 34))(34)>(last-pair ())rest: expects argument of type <non-empty list>; given empty>(last-pair (list ()))(())

Page 29: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

5 TIPOSABSTRACTOSDE INFORMAÇÃO 27

Exercício5.16(Livro — 2.18) Definaum procedimentoreverse , querecebecomoargumentoumalista eretornaumalista comosmesmoselementos,maspelaordeminversa:

(reverse (list 1 4 9 16 25))(25 16 9 4 1)

Exercício5.17Definaumprocedimentomap, querecebecomoargumentosumprocedimentodeumargumentoeumalista,eretornaalistadosresultadosproduzidosaplicandoo procedimentoacadaelementodalista.

(map abs (list -10 2.5 -11.6 17))(10 2.5 11.6 17)

Exercício5.18(Livro — 2.23)O procedimentofor-each é semelhanteao map. Recebecomoargumentosum procedimentoe uma lista de elementos.No entanto,em vez de formar uma lista com osresultados,for-each apenasaplicao procedimentoa cadaum doselementosdecadavez,daesquerdaparaa direita. Os valoresretornadospelaaplicaçãodo procedimento aoselementosnãosãousados— for-each é usadocomprocedimentos queexecutamumaacção,tal comoimprimir. Porexemplo:

(for-each (lambda (x) (newline) (display x))(list 57 321 28))

5732128

O valor retornadopelachamadaa for-each (não ilustradoacima)podeserqualquercoisa,comoverdadeiro.Apresenteumaimplementaçãoparao procedimentofor-each .

Exercício5.19Implementeo procedimentoimprime-lista-de-pares doexercício5.14usandoo proce-dimentofor-each . Lembre-sequeo procedimentorecebeumalista de parese imprime ospares,um por linha,edeveassinalarquandoéquechegaaofim dalista. Porexemplo,

(imprime-lista-de-pares (list (cons "Luisa" 12345678)(cons "Jorge" 23456789)(cons "Maria" 34567890)(cons "Rui" 45678901)))

Deveráimprimir

Luisa -> 12345678Jorge -> 23456789Maria -> 34567890Rui -> 45678901Fim da lista

Page 30: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

5 TIPOSABSTRACTOSDE INFORMAÇÃO 28

Exercício5.20Escreva um procedimentosubstitui querecebedois elementose umalista e retornaumaoutralista queresultadesubstituirtodasasocorrênciasdo primeiro elementopelosegundonalista inicial. Porexemplo:

(substitui 2 3 (list 1 2 3 2 5))(1 3 3 3 5)

(substitui 2 3 (list 1 3 5 7))(1 3 5 7)

Exercício5.21Escrevaumaversãodoprocedimentosubstitui utilizandoo procedimentomap.

Exercício5.22(Livro — 2.21)O procedimentosquare-list recebecomoargumentoumalista denúmerose retornaumalista comosquadradosdessesnúmeros.

(square-list (list 1 2 3 4))(1 4 9 16)

Seguem-seduasdefiniçõesdiferentesparao procedimento square-list . Completeambasasdefinições,preenchendoasexpressõesquefaltam:

(define (square-list items)(if (null? items)

()(cons <??> <??>)))

(define (square-list items)(map <??> <??>))

Exercício5.23Escrevaumprocedimento filtra querecebeumpredicadoeumalistae retornaumalistaquecontémapenasoselementosdalista inicial quesatisfazemo predicado.Porexemplo:

(filtra even? (list 1 2 3 4 5))(2 4)

(filtra even? (list 1 3 5 7))()

Exercício5.24Escrevaumprocedimentotodos? querecebeumpredicadoeumalistae retornaverdadeirosetodososelementosdalistasatisfizeremo predicadoe falsocasocontrário. Porexemplo:

Page 31: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

5 TIPOSABSTRACTOSDE INFORMAÇÃO 29

(todos? even? (list 1 2 3 4 5))#f

(todos? even? (list 2 4 6))#t

Exercício5.25Escrevaumprocedimentoalgum? querecebeumpredicadoeumalistae retornaverdadeirosealgumdoselementosdalistasatisfizero predicadoe falsocasocontrário.Porexemplo:

(algum? odd? (list 1 2 3 4 5))#t

(algum? odd? (list 2 4 6))#f

Exercício5.26Escreva um procedimento fold-right querecebeum procedimentode dois argumentos, ovalor inicial deum acumuladore umalista e retornao resultadodeaplifirst o procedimentoaoelementoinicial e aoresultadodeaplifirst o procedimento a todososelementosqueestãoà suadireita.Quandoa lista for vazia,esteprocedimentodeve retornaro valor inicial. Porexemplo:

(fold-right + 0 (list 1 2 3 4))10

(fold-right + 0 ())0

Exercício5.27Combasenoprocedimentofold-right escrevaosseguintesprocedimentos:

1. multiplica-lista querecebeumalistae retornao produtodetodososseuselemen-tos.

2. maximo-lista querecebeumalista e retornao maiordosseuselementos.

3. inverte-lista querecebeumalista e retornaoutra lista com os elementosda listainicial pelaordeminversa.

4. junta-listas querecebeduaslistase retornaoutralista queresultadejuntarasduas.

Exercício5.28Uma forma de compactarlistasde númerosé, dadauma lista de números(possivelmentere-petidos),transformá-la numalista em queocorrênciasconsecutivasde um mesmonúmerosãosubstituídasporumpar, emqueo primeiroelementoéo númerodevezesqueo númeroaparecerepetidoeo segundoelementoéo número.Escrevao procedimentorun-length-encode quecompactalistasdeinteiros.Porexemplo,

Page 32: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

5 TIPOSABSTRACTOSDE INFORMAÇÃO 30

(run-length-encode ’(1 1 1 1 1 1 1 2 3 3 3 3 4 4 4 4 1 3 3 3 3))((7 . 1) 2 (4 . 3) (4 . 4) 1 (4 . 3))

(run-length-encode ’(1 2 1 2 3 3 3 3 4 4 4 4 1 1 3 3 3 3 3))(1 2 1 2 (4 . 3) (4 . 4) (2 . 1) (5 . 3))

Reparequeassequênciasdeapenasumelementonãosãosubstituidas.

Depoisdeter umalista compactada,podesernecessáriosaberqualeraa lista original. Escrevao procedimentorun-length-decode que,dadaumalista deinteiroscompactada,retorna alistaoriginal. Porexemplo,

(run-length-decode ’((7 . 1) 2 (4 . 3) (4 . 4) 1 (4 . 3)))(1 1 1 1 1 1 1 2 3 3 3 3 4 4 4 4 1 3 3 3 3)

(run-length-decode ’(1 2 1 2 (4 . 3) (4 . 4) (2 . 1) (5 . 3)))(1 2 1 2 3 3 3 3 4 4 4 4 1 1 3 3 3 3 3)

Exercício5.29(Livro — exemplodapágina144)Definao procedimentomemq, querecebeum símboloe umalista e retornafalsoseo símbolonãoestiver contidonalista (isto é, nãofor eq? a nenhumdoselementosda lista) e a sublistaquecomeçacoma primeiraocorrênciado símbolona lista casocontrário.Porexemplo,

(memq ’apple ’(pear banana prune))#f

(memq ’apple ’(x (apple sauce) y apple pear))(apple pear)

Exercício5.30(Livro — 2.53)O queé queo interpretadorde Schemeimprime comorespostaà avaliaçãodecadaumadasseguintesexpressões:

(list ’a ’b ’c)(list (list ’george))(rest ’((x1 x2) (y1 y2)))(cadr ’((x1 x2) (y1 y2)))(pair? (first ’(a short list)))(memq ’red ’((red shoes) (blue socks)))(memq ’red ’(red shoes blue socks))

Exercício5.31(Livro — 2.54)Duaslistassãoequal? secontiveremelementosiguaise estesestiverempelamesmaordem.Porexemplo,

(equal? ’(this is a list) ’(this is a list))

Page 33: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

5 TIPOSABSTRACTOSDE INFORMAÇÃO 31

éverdade,mas

(equal? ’(this is a list) ’(this (is a) list))

é falso. Para sermosmais precisos,podemosdefinir equal? recursivamenteem termosdaigualdadebásicaentresímboloseq? , dizendoquea eb sãoequal? seforemambossímbolose foremeq? ou foremamboslistasemque(first a) é equal? a (first b) e (resta) éequal? a (rest b) . Usandoestaideia,implementeequal? comoum procedimento.

Exercício5.32(Livro — 2.55)O resultadodeavaliaraexpressão

(first ’’abracadabra)

équote . Expliqueporquê.

Exercício5.33Escreva um procedimentocount-if querecebeum predicadoe umalista e retornao númerodeelementosdalistaquesatisfazemo predicado.Porexemplo:

(count-if even? ’(1 2 3 2 5))2

(count-if (curry eq? ’a) ’(a b (a) c))1

Exercício5.34Escreva um procedimentoposition querecebeum objectoe umalista e retornaa primeiraposiçãoemqueocorreumelementonalistaeq? aoobjectodado.Senãoexistir nenhumobjectonessascondiçõesnalista o procedimento deve devolver #f . A posiçãodo primeiro elementodalistaéa0 (zero).Porexemplo:

(position ’a ’(a b c a b))0

(position ’a ’(b c a b))2

(position ’d ’(b c a b))#f

Exercício5.35Escreva um procedimentocomplement querecebeum predicadodeum argumentoe devolveanegaçãodessepredicado.Porexemplo:

((complement even?) 2)#f

((complement even?) 3)#t

Page 34: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

5 TIPOSABSTRACTOSDE INFORMAÇÃO 32

Exercício5.36Usandoosprocedimentosfiltra , curry ecomplement escrevaumprocedimentoremovequerecebeum objectoe umalista e devolve a lista queresultadeeliminar todososelementoseq? aoobjectodadodalistadada.Porexemplo:

(remove ’d ’(a b c))(a b c)

(remove ’a ’(a b c a b a))(b c b)

Exercício5.37Escrevaumprocedimento adjoin querecebeumelementoeumalistaeadicionao elementoàlistaapenasseeleaindanãoexistir nalista (deacordocomo eq? ). Porexemplo:

(adjoin ’a ’(a b c))(a b c)

(adjoin ’d ’(a b c))(d a b c)

Exercício5.38Escreva um procedimentoremove-duplicates que recebeuma lista e devolve uma listasemelementosrepetidos(deacordocomo eq? ). Porexemplo:

(remove-duplicates ’(a b c))(a b c)

(remove-duplicates ’(a b a a c a))(b c a)

Exercício5.39Escrevaumprocedimentomerge querecebeduaslistasdenúmerosporordemcrescenteedevedevolver umalista com todosos númerosdasduaslistasordenadospor ordemcrescente.Porexemplo:

(merge ’(1 4 7 10) ’(2 4 5 12))(1 2 4 4 5 7 10 12)

Exercício5.40Escrevaumprocedimentosubstitui-arvore quecorrespondeaoprocedimentosubsti-tui paraárvores,ou seja,quesubstituatodasasocorrênciasde um determinadoobjectoporoutronaárvore.Porexemplo:

(substitui-arvore 2 3 ’(5 2 (7 3 (2 1)) 4))(5 3 (7 3 (3 1)) 4))

Page 35: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

5 TIPOSABSTRACTOSDE INFORMAÇÃO 33

Exercício5.41Escreva um procedimentoprofundidade querecebeumaárvore e devolve um númeroqueindicaqualé o nível maisprofundode listasdentrodessalista, aumentandodeum semprequeseentraparadentrodeumalista. Sea lista nãocontémlistasdevolve0. Porexemplo:

(profundidade ’(1 2 3))0

(profundidade ’(1 2 (3 ((4) (5 (6))))))4

Exercício5.42(Livro — 2.27)Modifiqueo procedimentoreverse (do Livro — 2.18)paraproduzirum pro-cedimentodeep-reverse querecebeumalistacomoargumentoe retornaa listacomosseuselementosinvertidosecomtodasassuassublistastambeminvertidas.Porexemplo,

(define x (list (list 1 2) (list 3 4)))

x((1 2) (3 4))

(reverse x)((3 4) (1 2))

(deep-reverse x)((4 3) (2 1))

Lembre-sequeo procedimentoreverse recebecomoargumentoumalista e retornaumalistacomosmesmoselementos,maspelaordeminversa:

(define (reverse l)(define (r-aux l res)

(if (null? l)res(r-aux (rest l) (cons (first l) res))))

(r-aux l ()))

Exercício5.43(Livro — 2.28) Escreva um procedimento fringe que recebecomo argumentouma árvore(representadacomoumalista de listas)e retornaumalista cujoselementossãotodasasfolhasdaárvoredaesquerdaparaadireita.Porexemplo,

(define x (list (list 1 2) (list 3 4)))

(fringe x)(1 2 3 4)

(fringe (list x x))(1 2 3 4 1 2 3 4)

Page 36: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

5 TIPOSABSTRACTOSDE INFORMAÇÃO 34

Exercício5.44(Livro — 2.30)Definao procedimentosquare-tree análogoaosquare-list (do Livro— 2.21).O procedimentosquare-tree deve-secomportardaseguinteforma:

(square-tree(list 1

(list 2 (list 3 4) 5)(list 6 7)))

(1 (4 (9 16) 25) (36 49))

Devedefiniresteprocedimento directamente(istoé,semusarprocedimentosdeordemsuperior)e tambémusandoo procedimentomap.

Exercício5.45(Livro — 2.31) Abstraiaa suarespostaao exercício anteriorparaproduzir um procedimentotree-map , comapropriedadequesquare-tree poderiaserdefinidocomo:

(define (square-tree tree)(tree-map square tree))

Exercício5.46(Livro — 2.32) Podemosrepresentarum conjuntocomo uma lista de elementosdistintos,epodemosrepresentaro conjuntode todosos subconjuntosde um conjuntocomoumalista delistas.Porexemplo,seo conjuntoé (1 2 3) , entãoo conjuntodetodososseussubconjuntosé (() (3) (2) (2 3) (1) (1 3) (1 2) (1 2 3)) . Completeaseguintedefiniçãodeum procedimentoquegerao conjuntodossubconjuntosdeum conjuntoe dêumaexplicaçãoclaradeporqueéqueelefunciona.

(define (subsets s)(if (null? s)

(list ())(let ((rest (subsets (rest s))))

(append rest (map <??> rest)))))

Page 37: Exercícios da cadeira de Introdução à Programação · Este documento reúne os exercícios propostos nas aulas práticas da cadeira de Introdução à Pro-gramação da Licenciatura

6 O DESENVOLVIMENTO DE PROGRAMAS 35

6 O Desenvolvimento deprogramas