Recursividade Rodrigo Barbosa de Lima Bezerra [email_address]
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(&quot; %d\n &quot;,   num );  recursiveFunction ( num   +   1 );   } } void   recursiveFunction2 (int   num ) {  if ( num   <   5 ) {  recursiveFunction2 ( num   +   1 );   printf(&quot; %d\n &quot;,   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

Recursividade

  • 1.
    Recursividade Rodrigo Barbosade Lima Bezerra [email_address]
  • 2.
    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
  • 3.
    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).
  • 4.
    Recursão de CaudaUma 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.
  • 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.
    Como desenvolver? Encontrea 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á.
  • 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.
    Ordem de chamadavoid recursiveFunction (int num ) { if ( num < 5 ) { printf(&quot; %d\n &quot;, num ); recursiveFunction ( num + 1 ); } } void recursiveFunction2 (int num ) { if ( num < 5 ) { recursiveFunction2 ( num + 1 ); printf(&quot; %d\n &quot;, num ); } }
  • 9.
    Vantagens e DesvantagensVantagem: 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.
  • 10.
    Referência Material deRecursividade da Profª Karina Oliveira: http://www.dei.unicap.br/~kkco/IntroProgI/SegundoGQ/NotasAulas/ProgI_Aula9_Recursividade.pdf