Recursividade

2,770 views

Published on

Aula sobre recursividade

  • Be the first to comment

Recursividade

  1. 1. Recursividade Rodrigo Barbosa de Lima Bezerra [email_address]
  2. 2. Definição <ul><li>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). </li></ul><ul><li>R¹ ≡ [C, R²] </li></ul><ul><li>R ≡ [C, R] R² ≡ [C, R³] </li></ul><ul><li>direta ... </li></ul><ul><li>Rn ≡ [C, R¹] indeireta </li></ul>
  3. 3. Fundamentos <ul><li>Solução trivial: não usa recursão . Dada por definição. Resolvida por um conjunto de comandos. </li></ul><ul><li>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). </li></ul>
  4. 4. Recursão de Cauda <ul><li>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. </li></ul><ul><li>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. </li></ul>
  5. 5. 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
  6. 6. Como desenvolver? <ul><li>Encontre a solução geral (solução genericamente aplicável); </li></ul><ul><li>Encontre a solução trivial (regra de parada) </li></ul><ul><li>Monte seu algoritmo combinando a solução trivial e a solução geral utilizando de uma estrutura condicional ( if ); </li></ul><ul><li>Certifique-se que a recursividade sempre terminará. </li></ul>
  7. 7. 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 ); }
  8. 8. Ordem de chamada void recursiveFunction (int num ) { if ( num < 5 ) { printf(&quot; %dn &quot;, num ); recursiveFunction ( num + 1 ); } } void recursiveFunction2 (int num ) { if ( num < 5 ) { recursiveFunction2 ( num + 1 ); printf(&quot; %dn &quot;, num ); } }
  9. 9. Vantagens e Desvantagens <ul><li>Vantagem: </li></ul><ul><ul><li>Torna o algoritmo elegante: claro, simples e conciso. </li></ul></ul><ul><li>Desvantagem: </li></ul><ul><ul><li>Mais gasto de tempo e de espaço </li></ul></ul><ul><li>Obs.: Um algoritmo iterativo, na maioria das vezes, é mais eficiente do que seu similar recursivo. </li></ul>
  10. 10. Referência <ul><ul><li>Material de Recursividade da Profª Karina Oliveira: </li></ul></ul><ul><ul><li>http://www.dei.unicap.br/~kkco/IntroProgI/SegundoGQ/NotasAulas/ProgI_Aula9_Recursividade.pdf </li></ul></ul>

×