Licenciatura em Engenharia Informática e Computação
Introdução à Programação I
Ano lectivo de 2001/2002

Folha 2
Procedimentos e Recursividade

2.1 (Analisar Procedimento)

Considere a seguinte definição
   (define mais-abs
      (lambda (a b)
         ((if (> b 0) + -) a b)))
Explique o funcionamento do procedimento indicado e teste-o.

2.2 (Ano Bissexto)

O ano bissexto ocorre de 4 em 4 anos, com excepção dos anos de século que são bissextos só de 4 em 4 séculos, ou seja cada 400 anos. Escreva um procedimento bissexto? com argumento um número inteiro (ano) e que retorne um valor lógico (#t ou #f) indicando se o ano é bissexto.

2.3 (Dias entre datas)

Escreva um procedimento que tenha como argumentos 2 datas (3 inteiros para cada uma, indicando o ano, o mês, o dia) e calcule o número de dias entre as datas.

2.4 (Algoritmo de Euclides do Máximo Divisor Comum)

O máximo divisor comum de 2 inteiros a e b é por definição o maior inteiro que divide a e b com resto 0. O algoritmo de Euclides para o máximo divisor comum baseia-se no facto de que, quando efectuamos a divisão com resto de 2 inteiros a e b (a >= b) 2 casos podem ocorrer: Escreva um procedimento em Scheme para calcular o máximo divisor comum usando o algoritmo de Euclides.

2.5 (Raiz quadrada)

A raiz quadrada de um número pode ser obtida de forma iterativa usando o método de Newton. A partir de uma aproximação inicial y da raiz de um número x, uma melhor aproximação pode ser obtida fazendo a média de y e x/y.

2.5.a Defina o procedimento media que calcula a média dos valores dos seus argumentos.

    (media 2 5)	        -> 3.5

2.5.b Defina o procedimento melhora-aprox que tem como argumentos o número e a aproximação da raiz e efectua uma iteração do método.

    (melhora-aprox 2 1) -> 1.5

2.5.c Defina o predicado ja-chega? com 3 argumentos: o número, o valor aproximado da raiz e um valor de erro; o predicado deve retornar #t quando o quadrado da aproximação e o número diferirem de menos do que o valor do erro dado e #f no caso contrário.

2.5.d Use os procedimentos anteriores para construir raiz, um procedimento que tem como argumentos um número, uma aproximação inicial e uma precisão e calcula a raiz quadrada do número iterativamente na precisão indicada.