Recursividade
Programação II
Recursividade
Recursividade
1. O objeto é definido a partir dele mesmo
2. Uma computação pode ser definida a
partir dela mesma
3. Uma função pode ser definida a partir dela
mesma.
4. Recursividade pode repetir uma mesma
computação sobre um conjunto de dados
menor
O objeto é definido a partir dele
mesmo
• Exemplo - Números
Naturais:
0 está em N;
Se n está em N, então n +
1 está em N.
Uma computação pode ser
definida a partir dela mesma
• Seqüência de Fibonacci:
F(1) = F(0) = 1
F(n) = F(n − 1) + F(n − 2).
Uma função pode ser definida a
partir dela mesma
função fatorial(n){
se (n <= 1)
retorne 1;
senão
retorne n * fatorial(n-1);
}
Recursividade pode repetir uma mesma
computação sobre um conjunto de dados
menor
• A função chama a si mesma recursivamente em
uma versão menor da entrada (n - 1):
funcao procura(x, v, n) {
se (v[n] == x)
retorne n
senao
retorne procura (x,v,n-1)
}
Recursividade
•Toda função recursiva pode ser construída de maneira
não recursiva;
•Não melhora o desempenha de programas
–Uma ativação de uma função tem custo computacional mais
alto que uma interação de um laço equivalente (por exemplo).
•Ocupa mais espaço que soluções não recursivas
–Quando uma função chama a si mesmo, cada ativação recebe
um conjunto novo de todos os dados locais, incluindo os
parâmetros, independente do conjunto anterior.
•Geralmente as soluções recursivas são algoritmos
menores, mais elegantes e mais fáceis de entender;
Mais exemplos
• Número de Fibonacci de ordem n
int fibRec(int n)
{if (n == 0) return 0;
if (n == 1) return 1;
return fibRec(n - 1) + fibRec(n - 2);
}
Imprimir um número como uma cadeia de
caracteres
imprdecRecursivo(n)
int n;
{
int i;
printf("%d\n",n);
if (n<0) {
putchar('-');
n = -n;
}
if ((i=n/10)!=0) {
imprdecRecursivo(i);
}
putchar(n%10 + '0');
}
Exercícios
•
•
•
Construa uma versão não recursiva para as
funções fibRec e imprdecRecursivo.
Adapte a idéia da função imprdecRecursivo para
escrever uma versão recursiva da função itoa(n),
que converte um inteiro para uma cadeia de
caracteres.
Escreva uma versão recursiva da função
inverte(s), que inverte a cadeia de caracteres s.
Download

Recursividade