9 de jun. de 2010

Explicando a Recursividade

clip_image002

Um algoritmo é recursivo quando ele usa a si mesmo, más com parâmetros diferentes, para computar um problema. Pode ser uma função/método (subprogramação).

É uma técnica extremamente utilizada em aplicações matemáticas, onde são escalonada funções até que se obtenha o resultado final. (Algo como resolver uma equação “de trás para frente”)

É importante que ao usar uma função recursivamente, a mesma tenha um ponto de finalização, ou seja, um dos retornos da função que não dependa mais da recursão.

Um exemplo clássico é o cálculo do fatorial de um número, ex: 5! = 5 * 4 * 3 * 2 * 1 = 120. Acompanhe o algoritmo abaixo:

#include <conio.h>
#include <stdio.h>

int CalcularFatorial(int numero)
{
    // -> Fórmula numero! = numero*(numero-1)!

    // -> Condição de término.
    if(numero == 1)
        return 1;
    else if(numero == 0)
        return 1;

    // -> Chamada recursiva.
    int resultado = numero * CalcularFatorial(numero - 1);

    return resultado;
}

void main()
{
    int numero = 0;
    int resultado = 0;
    printf("Informe um número para o cálculo Fatorial: ");
    scanf("%d", &numero);

    // -> Chama a função pela primeira vez.
    resultado = CalcularFatorial(numero);

    printf("Resultado: %d", resultado);
    getch();
}

 

Este código apresenta a seguinte saída:

image

Na execução do cálculo houve um empilhamento de chamadas da função CalcularFatorial(), até que a mesma atingisse a condição de saída, ou seja numero == 1 ou numero == 2. Acompanhe este processo nas imagens abaixo:

image image

Podemos explorar a recursividade em diversos aspectos, tomando sempre o cuidado coma sua condição de saída. Acompanhe mais um exemplo, agora com o cálculo de uma seqüência Fibonacci:

image

#include <stdio.h>
#include <conio.h>

int CalcularFibonacci(int numero)
{
    // -> Fórmula: F(n) = F(n-1) + F(n-2)

    // -> Condição de Saída
    if (numero == 0)
        return 0;
    else if (numero == 1)
        return 1;

    // -> Chamada Recursiva.
    int resultado = CalcularFibonacci(numero - 1) + CalcularFibonacci(numero - 2);
    return resultado;
}

void main()
{
    int numero = 0;
    printf("Informe um número para o cálculo Fibonacci: ");
    scanf("%d", &numero);

    // -> Chamada da função pela primeira vez.
    int resultado = CalcularFibonacci(numero);

    printf("Resultado: %d", resultado);
    getch();
}

 

Este código gera a seguinte saída:

image 

É isso daí, agora ficam alguns exercícios para refletirmos:

  1. Fazer um programa em C que some os números inteiros positivos de 1 a n.
  2. Fazer um programa em C que calcule o resultado de um número inteiro elevado a um segundo número inteiro, ambos positivos. Ex:  2³.
  3. image

Espero ter ajudado, até a próxima :)

3 comentários:

Márcio Fábio Althmann disse...

Muito bom Spoky, simples e perfeito.

Abraços.

Garou disse...

Recursividade é muito interessante, muitos se assustam mas depois que entendi, vi que essa técnica poderia simplificar várias tarefas.
Só há o defeito de ser exponencialmente "pesado" enquanto nao começar a desempilhar, preocupação que vem sendo descartada hje em dia né? XP

Gostei man, axo q vo entra de penetra numa aula tua ein XP

Anônimo disse...

a melhor definição de recursividade é
Recursividade: ver "recursividade"