Beruflich Dokumente
Kultur Dokumente
Captulo 6
Funes Recursivas
Departamento de Computao
Universidade Federal de Ouro Preto
2012.1
1/39
1 Funes recursivas
2 Recursividade mtua
3 Recursividade de cauda
2/39
Tpicos
1 Funes recursivas
2 Recursividade mtua
3 Recursividade de cauda
3/39
Recursividade
4/39
Estratgia recursiva
5/39
Definio recursiva
6/39
Exemplo: fatorial
7/39
Exemplo: fatorial (cont.)
8/39
Exemplo: fatorial (cont.)
Exerccio 1
Digite a funo fatorial em um arquivo fonte Haskell e carregue-o no ambiente
interativo de Haskell.
a) Mostre que fatorial 7 = 5040.
b) Determine o valor da expresso fatorial 7 usando o ambiente interativo.
c) Determine o valor da expresso fatorial 1000 usando o ambiente interativo.
Se voc tiver uma calculadora cientfica, verifique o resultado na calculadora.
d) Qual o valor esperado para a expresso
div (fatorial 1000) (fatorial 999)? Determine o valor desta expresso
usando o ambiente interativo.
e) O que acontece ao calcular o valor da expresso fatorial (-2)?
9/39
Exemplo: potncias de 2
10/39
Exemplo: potncias de 2 (cont.)
11/39
Exemplo: potncias de 2 (cont.)
Exerccio 2
Considere a seguinte definio para a funo potncia de 2:
pot2 :: Integer -> Integer
pot2 n
| n == 0 = 1
| otherwise = 2 * pot2 (n-1)
O que acontece ao calcular o valor da expresso pot2 (-5)?
12/39
Exemplo: multiplicao
13/39
Exemplo: multiplicao (cont.)
14/39
Exemplo: multiplicao (cont.)
Exerccio 3
Mostre que mul 5 6 = 30.
15/39
Exemplo: sequncia de Fibonacci
Na seqncia de Fibonacci
0, 1, 1, 2, 3, 5, 8, 13, . . .
16/39
Exemplo: sequncia de Fibonacci (cont.)
Neste caso temos recurso mltipla, pois a funo sendo definida usada
mais de uma vez em sua prpria definio.
Aplicando a funo de fibonacci:
fib 5
fib 3 + fib 4
(fib 1 + fib 2) + (fib 2 + fib 3)
(1 + (fib 0 + fib 1)) + ((fib 0 + fib 1) + (fib 1 + fib 2))
(1 + (0 + 1)) + ((0 + 1) + (1 + (fib 0 + fib 1)))
(1 + 1) + (1 + (1 + (0 + 1)))
2 + (1 + (1 + 1))
2 + (1 + 2)
2 + 3
5
17/39
Exemplo: sequncia de Fibonacci (cont.)
Exerccio 4
Mostre que fib 6 = 8.
18/39
Tpicos
1 Funes recursivas
2 Recursividade mtua
3 Recursividade de cauda
19/39
Recursividade mtua
20/39
Exemplo: par e mpar
21/39
Exemplo: par e mpar (cont.)
22/39
Exemplo: par e mpar (cont.)
23/39
Tpicos
1 Funes recursivas
2 Recursividade mtua
3 Recursividade de cauda
24/39
Recursividade de cauda
25/39
Recursividade de cauda (cont.)
Exemplo:
A funo recursiva a seguir no apresenta recursividade de cauda:
fatorial :: Integer -> Integer
fatorial n
| n == 0 = 1
| n > 0 = fatorial (n-1) * n
No caso recursivo, o resultado da chamada recursiva fatorial (n-1)
multiplicado por n para produzir o resultado final.
26/39
Recursividade de cauda (cont.)
Exemplo:
A funo recursiva a seguir no apresenta recursividade de cauda:
par :: Integer -> Bool
par n
| n == 0 = True
| n > 0 = not (par (n-1))
No caso recursivo, a funo not aplicada ao resultado da chamada
recursiva par (n-1) para produzir o resultado final.
27/39
Recursividade de cauda (cont.)
Exemplo:
A funo recursiva potencia2 a seguir apresenta recursividade de cauda:
28/39
Recursividade de cauda (cont.)
Exerccio 5
Mostre que potencia2 5 = 32.
Exerccio 6
Faa uma definio recursiva da funo par usando recursividade de cauda.
29/39
Otimizao de chamada de cauda
30/39
Otimizao de chamada de cauda (cont.)
Uma chamada de cauda acontece quando uma funo chama outra funo
como sua ltima ao, no tendo mais nada a fazer. O resultado final da
funo dado pelo resultado da chamada de cauda.
Em tais situaes o programa no precisa voltar para a funo que chama
quando a funo chamada termina.
Portanto, aps a chamada de cauda, o programa no precisa manter
qualquer informao sobre a funo chamadora na pilha.
Algumas implementaes de linguagem tiram proveito desse fato e na
verdade no utilizam qualquer espao extra de pilha quando fazem uma
chamada de cauda.
Esta tcnica chamada de eliminao da cauda, otimizao de chamada
de cauda ou ainda otimizao de chamada recursiva.
A otimizao de chamada de cauda permite que funes com
recursividade de cauda recorram indefinidamente sem estourar a pilha.
Muitas linguagens funcionais no possuem estruturas de repetio e usam
funes recursivas para fazer repeties.
Nestes casos a otimizao de chamada de cauda fundamental para uma
boa eficincia dos programas. 31/39
Vantagens de usar recursividade
32/39
Exerccios
Exerccio 7
O fatorial duplo de um nmero natural n o produto de todos os nmeros de 1 (ou
2) at n, contados de 2 em 2. Por exemplo, o fatorial duplo de 8
8 6 4 2 = 384, e o fatorial duplo de 7 7 5 3 1 = 105.
Defina uma funo para calcular o fatorial duplo usando recursividade.
Exerccio 8
Defina uma funo recursiva que recebe dois nmeros naturais m e n e retorna o
produto de todos os nmeros no intervalo [m, n]:
m (m + 1) (n 1) n
33/39
Exerccios (cont.)
Exerccio 9
Usando a funo definida no exerccio 8, escreva uma definio no recursiva
para calcular o fatorial de um nmero natural.
Exerccio 10
Defina uma funo recursiva para calcular a soma de dois nmeros inteiros, sem
usar os operadores + e -. Utilize as funes succ e pred da biblioteca, que
calculam respectivamente o sucessor e o antecessor de um valor.
Exerccio 11
Defina uma funo recursiva para calcular a potncia de um nmero,
considerando que o expoente um nmero natural. Utilize o mtodo das
multiplicaes sucessivas.
34/39
Exerccios (cont.)
Exerccio 12
A raiz quadrada inteira de um nmero inteiro positivo n o maior nmero inteiro
cujo quadrado menor ou igal a n. Por exemplo, a raiz quadrada inteira de 15 3,
e a raiz quadrada inteira de 16 4.
Defina uma funo recursiva para calcular a raiz quadrada inteira.
Exerccio 13
Defina duas funes recursivas que calculam o quociente e o resto da diviso
inteira de dois nmeros inteiros usando subtraes sucessivas.
35/39
Exerccios (cont.)
Exerccio 14
Defina uma funo recursiva para calcular o mximo divisor comum de dois
nmeros inteiros no negativos a e b, usando o algoritmo de Euclides:
a
se b = 0,
mdc(a, b) = mdc(b, a mod b) se b > 0,
mdc(a, b) se b < 0
Nota: o preldio j tem a funo gcd :: Integral a => a -> a -> a que
calcula o mximo divisor comum de dois nmeros integrais.
36/39
Exerccios (cont.)
Exerccio 15
Faa uma definio recursiva para uma funo
maior :: (Integer -> Integer) -> Integer -> Integer
que recebe uma funo f e um nmero inteiro no negativo n, e retorna o maior
dos valores
f 0, f 1, f 2, . . . , f (n-1), f n
37/39
Exerccios (cont.)
Exerccio 16
Considere a seguinte funo para calcular o fatorial de um nmero:
fat n = fat n 1
where
fat n x
| n == 0 = x
| n > 0 = fat (n-1) (n*x)
Exerccio 17
Defina uma funo com recursividade de cauda para calcular o n-simo (n 0)
nmero de Fibonacci.
38/39
Fim
39/39