Italo Info


Funções recursivas

As linguagens de programação costumam oferecer suporte para a chamada de uma função dentro do bloco de código dela mesma. Essa chamada é dita recursiva. Abaixo um exemplo:

void recursividade() {
    recursividade();
}

A função de nome recursividade é chamada no corpo dela mesma. No entanto, essa chamada recursiva gera um loop infinito. Isto é, leva o programa a travar. Por isso, normalmente, as funções recursivas têm uma condição de parada para evitar o loop infinito. Veja o exemplo abaixo:


int fatorial( int n ) {
    if ( n == 0 )
        return 1;
    return n * fatorial( n-1 );
}

A função acima recebe como parâmetro um número e retorna o fatorial dele. Ex: fatorial de 3 = 3*2*1. Ou seja, fatorial de 3 é igual ao 3 vezes o fatorial de 2. Isso significa que o fatorial de N é igual a N vezes o fatorial de N-1. Atenção a condição de parada ( n == 0 ) que evida o loop infinito! Perceba que n vai sendo decrementado a cada chamada recursiva da função fatorial: fatorial( n-1 ) até atingir a condição de parada, quando a função é chamada com n igual a zero, é retornado o valor 1 sem chamar novamente recursivamente a função fatorial, o que termina a execução da chamada atual da função.

Abaixo outro exemplo, função que retorna o elemento da série fibbonacci, de acordo com o indice do elemento passado como parâmetro. Ex: fibo( 5 ) = fibo( 4 ) + fibo( 3 ), ou seja, fibo( n ) = fibo( n-1 ) + fibo( n-2 ).


int fibo( int n ) {
    if ( n == 1 || n == 2 )     
        return 1;   
    return fibo( n-1 ) + fibo( n-2 );
}

Lembrando que a série fibbonacci é: 1 1 2 3 5 8 13 21...

fibo(1) = 1;
fibo(2) = 1;
fibo(3) = fibo(2) + fibo(1) = 2;
fibo(4) = fibo(3) + fibo(2) = 3;
fibo(5) = fibo(4) + fibo(3) = 5;
fibo(6) = fibo(5) + fibo(4) = 8;
...
fibo(N) = fibo(N-1) + fibo(N-2);

Abaixo um exemplo de função recursiva que imprime (em ordem decrescente) os números de 1 a um número passado como parâmetro:


int imp_ordem_decrescente( int n ) {
    if ( n > 0 ) {  
        printf( "%d ", n );
        imp_ordem_decrescente( n-1 );
    }
}

Abaixo o código fonte completo:


#include <stdio.h>

int fatorial( n ) {
    if ( n == 0 )
       return 1;
    return n * fatorial( n-1 );
}

int fibo( int n ) {
    if ( n == 1 || n == 2 )     
        return 1;   
    return fibo( n-1 ) + fibo( n-2 );
}

int imp_ordem_decrescente( int n ) {
    if ( n > 0 ) {  
        printf( "%d ", n );
        imp_ordem_decrescente( n-1 );
    }
}

int main() {
    int num, fat, fib;
    
    printf( "Informe um numero: " );
    scanf( "%d", &num );
    
    fat = fatorial( num );
    fib = fibo( num );
    
    printf( "\nFatorial(%d) = %d", num, fat );
    printf( "\nFibo(%d) = %d", num, fib );  
    
    printf( "\nOrdem decrescente: " );
    imp_ordem_decrescente( num );
    
    return 0;
}

Exercício

1) Faça uma função recursiva que imprima (em ordem crescente) os números de 1 a um número informado pelo usuário. Exemplo de saída:

Informe um número: 10
Ordem crescente: 1 2 3 4 5 6 7 8 9 10

Dica: A função deve fazer a chamada recursivamente antes de imprimir o número.