Capítulo 4 Estruturação de Procedimentos 4. Exercícios de revisão. Diga o que entende por linguagem estruturada em blocos. Descreva a regra associada a esta estrutura, e diga qual a sua importância. 2. O que entende pelo domínio de um nome? 4.2 Exercícios de programação 4.2. Estrutura de Blocos. () Considere as seguintes alternativas para definir um procedimento que calcula a função factorial. Alternativa : (define (factorial n) (if (>= n 0) (fact-aux n) (error "factorial: argumento negativo"))) (define (fact-aux n) (if (= n 0) (* n (fact-aux (- n ))))) Alternativa 2: (define (factorial n) (define (fact-aux n) (if (= n 0) (* n (fact-aux (- n ))))) (if (>= n 0) (fact-aux n) (error "factorial: argumento negativo")))
40 CAPÍTULO 4. ESTRUTURAÇÃO DE PROCEDIMENTOS (a) Compare estas duas alternativas quanto à garantia de que o factorial não é calculado com valores indevidos. Sugestão: Será que se pode avaliar directamente (fact-aux -)? (b) Como se chama a estrutura definida pela alternativa 2? Qual a sua vantagem? 2. () A estrutura de blocos leva à existência de novos ambientes. Com base no procedimento que se segue, que calcula m! n! (m >n), justifique a afirmação. Sugestão: Identifique as variáveis locais e não locais para cada um dos procedimentos. (define (quociente-de-factoriais m n) (define (iter m res) (if (= m n) res (iter (- m ) (* m res)))) (iter m )) 3. () (Secção 2.2.3, Ex 2) Recorrendo à estrutura de blocos, escreva um procedimento em Scheme somatorio que recebe um número inteiro positivo n, e devolve a soma de todos os números até n. O seu procedimento deve gerar um processo iterativo. > (somatorio 3) 6 > (somatorio 6) 2 4. () (Secção 2.2.3, Ex 4) Recorrendo à estrutura de blocos, escreva um procedimento em Scheme factorial que recebe um número inteiro positivo n, e devolve o factorial desse número. O seu procedimento deve gerar um processo iterativo. > (factorial 0) > (factorial 5) 20 5. (2) (Secção 2.2.3, Ex 7) Recorrendo à estrutura de blocos, escreva um procedimento em Scheme numero-primos-menores que recebe um número inteiro positivo n, e retorna o número de primos menores ou iguais a n. O seu procedimento deve gerar um processo iterativo. Sugestão: Utilize o procedimento primo? definido na alínea 7 da Secção 3.2. > (numero-primos-menores 9) 4 > (numero-primos-menores 23) 9
4.2. EXERCÍCIOS DE PROGRAMAÇÃO 4 6. (2) (Secção 2.2.3, Ex 8) Recorrendo à estrutura de blocos, escreva um procedimento em Scheme numero-divisores-primos que recebe um número inteiro positivo n, e retorna o número de divisores primos de n. No caso de n ser 0 deverá retornar 0. O seu procedimento deve gerar um processo iterativo. Sugestão: Utilize o procedimento primo? definido na alínea 7 da Secção 3.2. > (numero-divisores-primos ) 0 > (numero-divisores-primos 20) 2 > (numero-divisores-primos 30) 3 7. (3) (Secção 2.2.3, Ex 0) O logaritmo inteiro de um número n na base b é o maior número inteiro e tal que b e n. Recorrendo à estrutura de blocos, escreva um procedimento em Scheme logaritmo que recebe dois números inteiros positivos n e b, e devolve o logaritmo inteiro de n na base b. No caso de n ou b serem 0 deverá retornar 0. O seu procedimento deve gerar um processo iterativo. > (logaritmo 8 2) 3 > (logaritmo 7 2) 2 8. (3) (Secção 2.2.3, Ex 5) Recorrendo à estrutura de blocos, escreva um procedimento em Scheme soma-digitos-pares que recebe um número inteiro positivo n, e retorna a soma de todos os dígitos pares de n. O seu procedimento deve gerar um processo iterativo. > (soma-digitos-pares 9) 0 > (soma-digitos-pares 42) 6 9. (4) (Secção 2.2.3, Ex 9) Um número binário b n b n...b b 0 pode ser transformado num número decimal usando a seguinte formula n i=0 b i2 i. Recorrendo à estrutura de blocos, escreva um procedimento em Scheme binario-decimal que recebe um número b escrito em binário e retorna a sua representação decimal. O seu procedimento deve gerar um processo iterativo. > (binario-decimal 00) 9 > (binario-decimal 0000) 6
42 CAPÍTULO 4. ESTRUTURAÇÃO DE PROCEDIMENTOS 4.2.2 Utilização de Nomes Locais. Em relação às seguintes expressões utilizando o let, avalie o valor da expressão e transforme-a numa expressão equivalente utilizando o lambda. (a) () (b) () (let ((x 5) (y 3)) (* x y)) (let ((x 4) (y 3)) (let ((z (* x y))) (+ z x))) (c) (2) (d) (2) (let ((x 5)) (let ((x 3) (y (* x 2))) (let ((x 5) (y 2)) (+ x (let ((x (+ x 3)))) 2. (2) Suponha que a tem o valor 5 no ambiente global. Diga qual o resultado de avaliar a seguinte expressão: (let ((a 3) (b (* a 4))) (+ a b)) 3. (2) Considere as seguintes expressões. São equivalentes? Justifique. (let ((x 8)) (let ((x 5) (y (+ x 4))) (let* ((x 8) (x 5) (y (+ x 4))) (+ x y)) 4. Para cada uma das seguintes combinações envolvendo uma expressão lambda, calcule o seu valor e transforme-a numa expressão equivalente utilizando o let. (a) ()
4.2. EXERCÍCIOS DE PROGRAMAÇÃO 43 (b) () ((lambda (x y) (+ (* 3 x) y)) 2 3) ((lambda (x) ((lambda (y) ((lambda (z) (* y z)) 2)) 5) (c) () (d) (2) ((lambda (x) ((lambda (y) (+ (* 2 y) x)) (+ x 3))) 5) ((lambda (x y) ((lambda (x) (+ (* 2 x) y)) 6 2) (e) (2) ((lambda (x y) (+ x y ((lambda (z) (* 2 z)) (+ y )))) 5 2) 5. Para cada uma das seguintes séries, escreva um programa em Scheme que calcula o valor aproximado da série. O seu programa deve apresentar uma estrutura de blocos e deve evitar cálculos repetidos. Pode utilizar os procedimentos potencia e factorial sem os definir. (a) (2) (b) (2) + 2 + 4 + 8 + 6 +...= n=0 2 n 2 + 3 4 + 5 +...= ( ) n+ n = ln(2) n=0
44 CAPÍTULO 4. ESTRUTURAÇÃO DE PROCEDIMENTOS (c) (2) (d) (2) n=0 n= x n n! = ex x2 2! + x4 4!...= ( ) n+ x 2n 2 (2n 2)! = cos(x)