Escolar Documentos
Profissional Documentos
Cultura Documentos
05 Recursividade PDF
05 Recursividade PDF
Aula 5
Funes Recursivas
Departamento de Computao
Universidade Federal de Ouro Preto
2011.2
1/39
1 Funes recursivas
2 Recursividade mtua
3 Recursividade de cauda
2/39
Layout
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
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
Exerccio 3
Mostre que mul 5 6 = 30.
14/39
Exemplo: sequncia de Fibonacci
I Na seqncia de Fibonacci
0, 1, 1, 2, 3, 5, 8, 13, . . .
16/39
Exemplo: sequncia de Fibonacci (cont.)
Exerccio 4
Mostre que fib 6 = 8.
17/39
Layout
1 Funes recursivas
2 Recursividade mtua
3 Recursividade de cauda
18/39
Recursividade mtua
19/39
Exemplo: par e mpar
20/39
Exemplo: par e mpar (cont.)
22/39
Layout
1 Funes recursivas
2 Recursividade mtua
3 Recursividade de cauda
23/39
Recursividade de cauda
24/39
Recursividade de cauda (cont.)
I 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.
25/39
Recursividade de cauda (cont.)
I 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.
26/39
Recursividade de cauda (cont.)
I Exemplo:
A funo recursiva potencia2 a seguir apresenta recursividade
de cauda:
potencia2 :: Integer -> Integer
potencia2 n = potencia2 n 1
27/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.
28/39
Otimizao de chamada de cauda
29/39
Otimizao de chamada de cauda (cont.)
30/39
Otimizao de chamada de cauda (cont.)
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:
mdc(a, b)
se b < 0,
mdc(a, b) = a se b = 0,
mdc(a, b mod a) se b > 0
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