Recursividade
-
Upload
rodrigo-barbosa -
Category
Technology
-
view
2.296 -
download
1
description
Transcript of Recursividade
Definição
Um algoritmo é dito recursivo quando chama a si mesmo (recursão direta) ou chama uma seqüência de outros algoritmos, e um deles chama novamente o primeiro (recursão indireta).
R¹ [C, R²]≡R ≡ [C, R] R² [C, R³]≡direta ...
Rn [C, R¹]≡ indeireta
Fundamentos
Solução trivial: não usa recursão. Dada por definição. Resolvida por um conjunto de comandos.
Solução geral: parte do problema que é em essência igual ao original, porém menor. A solução, neste caso, pode ser obtida por uma chamada recursiva R(x-1).
Recursão de Cauda
Uma rotina apresenta recursão de cauda se a chamada recursiva está no final de seu código, tendo como única função criar um “looping” que será repetido até que a condição de parada (solução trivial) seja satisfeita.A recursão de cauda pode ser eliminada se empregarmos, em seu lugar, uma estrutura de repetição que esteja condicionada à expressão de teste usada na versão recursiva.
Recursão de Cauda - Exemplo
int fatorial (int n){if (n == 0 || n == 1)
return 1;return n * fatorial(n - 1);
}
int fatorial_ite(int n){ int fat = 1; while(n > 0) { fat = fat * n; --n; }}
Crescentemente recursivas
Como desenvolver?
Encontre a solução geral (solução genericamente aplicável);Encontre a solução trivial (regra de parada)Monte seu algoritmo combinando a solução trivial e a solução geral utilizando de uma estrutura condicional (if);Certifique-se que a recursividade sempre terminará.
Exemplos
fatorial(3) = 3 * fatorial(3 − 1) = 3 * fatorial(2) = 3 * 2 * fatorial(2 − 1) = 3 * 2 * fatorial(1) = 3 * 2 * 1 * fatorial(1 − 1) = 3 * 2 * 1 * fatorial(0) = 3 * 2 * 1 * 1 = 6
int fatorial (int n){if (n == 0 || n == 1)
return 1;return n * fatorial(n - 1);
}
Ordem de chamada
void recursiveFunction(int num) { if (num < 5) {
printf("%d\n", num); recursiveFunction(num + 1);
} }
void recursiveFunction2(int num) { if (num < 5) {
recursiveFunction2(num + 1); printf("%d\n", num);
} }
Vantagens e Desvantagens
Vantagem:Torna o algoritmo elegante: claro, simples e conciso.
Desvantagem:Mais gasto de tempo e de espaço
Obs.: Um algoritmo iterativo, na maioria das vezes, é mais eficiente do que seu similar recursivo.
Referência
Material de Recursividade da Profª Karina Oliveira:
http://www.dei.unicap.br/~kkco/IntroProgI/SegundoGQ/NotasAulas/ProgI_Aula9_Recursividade.pdf