Vous êtes sur la page 1sur 32

Estrutura de Dados 2

Recursividade

2011

1 / 32

O que recursividade?

a propriedade de algo ser definido em termos de si mesmo. Exemplo

rvore Binria (string de bits)


0. 1, seguido de dois strings de bits.

2011

2 / 32

Ao Infinito e Alm

A recursividade permite

a definio de um conjuto infinito de objetos por meio de uma formulao finita. (Wirth) escrever programas que realiza infinitas computaes com um nmero finito de instrues.

2011

3 / 32

Recursividade em Programas

Um algoritmo recursivo quando ele chama a si mesmo.

Exemplo

int xyz (int n) { if (n == 0) return 0; return n + xyz (n-1); }

O que o programa faz?

A recursividade pode ser direta ou indireta.


2011 4 / 32

Recursividade: como possvel?

Por meio de uma pilha.

int mdc (int m, int n) { if (n == 0) return m; return mdc (n, m % n); }

2011

5 / 32

Recursividade: como possvel?


int mdc (int m, int n) { if (n == 0) return m; return mdc (n, m % n); }

2011

6 / 32

Recursividade: como possvel?


int mdc (int m, int n) { if (n == 0) return m; return mdc (n, m % n); }

2011

7 / 32

Recursividade: como possvel?


int mdc (int m, int n) { if (n == 0) return m; return mdc (n, m % n); }

2011

8 / 32

Recursividade: como possvel?


int mdc (int m, int n) { if (n == 0) return m; return mdc (n, m % n); }

2011

9 / 32

Recursividade: como possvel?


int mdc (int m, int n) { if (n == 0) return m; return mdc (n, m % n); }

2011

10 / 32

Por que usar recursividade em programas?

Compaticidade

Cdigo com menos instrues.


Menos variveis. Controle implcito.

Elegncia. Contudo, recursividade demanda cuidados.

2011

11 / 32

Cuidados com a Recursividade (1)

Existncia da condio de parada. Deve haver um caso base a partir do qual a recurso cessa.

int xyz (int n) { if (n == 0) return 0; return n + xyz (n-1); }


Caso Base

2011

12 / 32

Cuidados com a Recursividade (2)

O tamanho do problema deve diminuir. Isto , a cada recurso o problema deve se aproximar do caso base. Observe:

O problema int strange (int N) diminui? { if (N == 1) return 1; if (N % 2) return strange (3 * N + 1); else return strange (N / 2); }
13 / 32

2011

Cuidados com a Recursividade (3)

O problema, em cada contexto recursivo, no deve ser redundante. Observe:

int fibo (int i){ if (i < 0) return 0; if (i == 0) return 1; return fibo (i 1) + fibo (i 2);}

2011

14 / 32

Fique atento!

A profundidade da recurso pode exaurir a memria.

Quantidade de chamadas recursivas sucessivas(consumo de memria). Observe o avaliador de expresso prfixada a seguir.

2011

15 / 32

O que uma Expresso Pr-Fixada?

aquela em que os operadores de uma expresso aritmtica precedem seus operandos.

Exemplo:
Infixada 5 * 4 3 * 5 + 4 3 * (5 + 4) Pr-Fixada * 5 4 + * 3 5 4 * 3 + 5 4

2011

16 / 32

Avaliador de Expresso Pr-Fixada


// Retorna o resultado de uma expresso pr-fixada char *s; int i = 0; int eval () { int n = 0; // operando da expresso while (s[i] == ' ') i ++; // salta brancos if (s[i] == '+') {i++; return eval () + eval ();} if (s[i] == '*') {i++; return eval () * eval ();} while ((s[i] >= '0') && (s[i] <= '9')) n = 10 * n + (s[i++] - '0'); return n;
2011 17 / 32

Qual a profundidade da recurso?


5 + (3 * (20 * (10 + 8)))
+ 5 * 3 * 20 + 10 8 5 * 3 * 20 + 10 8 * 3 * 20 + 10 8 3 * 20 + 10 8 * 20 + 10 8 20 + 10 8 + 10 8 10 8 8
Profundidade 4

2011

18 / 32

Qual a profundidade da recurso com relao a n?

int xyz (int n) { if (n == 0) return 0; return n + xyz (n-1); } O(n)

2011

19 / 32

Apesar de

todos os cuidados, em alguns casos, eliminar a recurso melhora o desempenho do programa.


int xyz (int n) { if (n <= 0) return 0; return n + xyz (n-1); }
Recursividade de Cauda

int xyz (int n) { int i, t; for (i = t = 1; i <= n; i++) t += i; return t; }

2011

20 / 32

Recursivadade de Cauda

quando a ltima linha do algoritmo uma chamada recursiva.

P {if (<cond>) then S; P;} P {S; if (<cond>) then P;}

S equivale a instrues que no possuem referncias a P.

Elimine a recursividade, nesses casos.

2011

21 / 32

Eliminando a Recursivadade de Cauda

Seja P(x) o algoritmo P com o argumento x. Substitua


a chamada recursiva por um lao; a ltima linha de P


P(y) por x = y e retornamos para a condio do lao.

2011

22 / 32

Recursivo para Iterativo


int mdc (int m, int n) { if (n == 0) return m; return mdc (n, m % n); } } return m;
Recursividade de Cauda
2011

int mdc (int m, int n){ int x; while (n > 0){ x = n; n = m % n; m = x;

}
23 / 32

Sempre possvel eliminar a recursividade?


Programa Recursivo Programa Iterativo Ok!

Programa Iterativo

Programa Recursivo

Ok!

2011

24 / 32

E quando a recursividade no de cauda?

Ento temos de implementar e usar explicitamente uma pilha.

Contudo, ir acarretar em um cdigo mais longo e, em geral, mais complexo.

2011

25 / 32

E quando os contextos so interdependentes...

e assim mesmo voc quer fazer uso de recurso? Tente Programao Dinmica.

2011

26 / 32

Programao Dinmica

Trata-se de uma tcnica que armazena os resultados computados.

Antes de se realizar uma nova computao, verifica-se se essa computao j foi realizada. Um caso tpico: Sequncia de Fibonacci.

2011

27 / 32

Sequncia de Fibonacci (recursivo)


int fibo (int i) { if (i < 1) return 0; if (i == 0) return 1; return fibo (i 1) + fibo (i - 2); }

2011

28 / 32

Sequncia de Fibonacci (p.din.)


int fibo (int i) { int t; if (known[i] != '?') return known[i]; if (i == 0) t = 0; if (i == 1) t = 1; if (i > 1) t = fibo (i - 1) + fibo (i - 2); return known[i] = t; }
2011 29 / 32

Consideraes Finais

Recursividade uma abordagem de escrita de algoritmos muito eficiente.

Cuidados devem ser tomados antes de escrever um algoritmo recursivo.

Algoritmos recursivos podem ser transformados em iterativos e viceversa.

Considere aspectos de desempenho.

2011

30 / 32

Consideraes Finais

Quando os contextos recursivos forem interdependentes, considere a programao dinmica.

2011

31 / 32

Referncia

Aho & Hopcroft & Ullman Cap.2 Sedgewick Cap.5 Tenenbaum et alli Cap.3 Cormen et alli Cap.2 & 15 Qualquer outro livro sobre AED

vide ndice remissivo: recursividade, funes recursivas

2011

32 / 32

Vous aimerez peut-être aussi