Post on 22-Dec-2018
ExercíciosdacadeiradeIntroduçãoàProgramação
CláudiaAntunesAnaCardosoCachopo
JoãoCachopoFranciscoCoutoAntónioLeitão
InêsLynceCésarPimentelH. SofiaPinto
Ano Lectivo 2002/2003ParteI
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)
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
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))
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))
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.
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:
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
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 .
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:
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? .
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
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.
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.
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:
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)
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
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.
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.
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.
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
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)))
()
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))))))
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.
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.
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:
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.
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 ()))(())
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
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:
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,
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))
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
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))
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)
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)))))
6 O DESENVOLVIMENTO DE PROGRAMAS 35
6 O Desenvolvimento deprogramas