Recursividade

10
Recursividade Rodrigo Barbosa de Lima Bezerra [email protected]

description

Aula sobre recursividade

Transcript of Recursividade

Recursividade

Rodrigo Barbosa de Lima [email protected]

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