aula 165

Comparando o algoritmo de Fibonacci RECURSIVO e ITERATIVO | tempo de execução

Nesta aula vamos comparar o algoritmo de Fibonacci RECURSIVO e ITERATIVO e comparar o tempo de execução de cada um. Como vimos nas aulas anteriores, é extremamente simples resolver alguns problemas com recursão. Contudo, será que sempre devemos utilizar algoritmos recursivos?

A recursão é uma feramente fantástica na computação, porém deve ser usada com cautela, como veremos na aula de hoje. Caso você não tenha feito a aula 158: Por que não devo usar Fibonacci recursivo? Sugiro que faça ela primeiro pois ajudará a entender a diferença de tempo entre as duas versões.

Código em C para o fibonacci recursivo e iterativo

Execute o código a seguir em sua máquina e observe a diferença de tempo entre as duas versões. Quanto maior for n, a função iterativa não sofrerá um grande acréscimo de tempo. Contudo, a função recursiva se tornará muito mais lenta. O motivo foi explicado em detalhes na aula 158.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

/*
        Aula 165: Calcular o tempo de execução do algoritmo de FIBONACCI recursivo e iterativo.

        Escrito por Wagner Gaspar
        Março de 2021
*/
/*
        Função recursiva para calcular um termo n da sequência de fibonacci
        Como a sequência cresce muito rápido, está sendo usado o operador long para que o tipo int ocupe 8 bytes.
*/
long long int fiboR(int n){
    if(n == 1)
        return 0;
    else{
        if(n == 2)
            return 1;
        else
            return fiboR(n - 1) + fiboR(n - 2);
    }
}

/*
        Função iterativa para calcular um termo n da sequência de fibonacci
        Como a sequência cresce muito rápido, está sendo usado o operador long para que o tipo int ocupe 8 bytes.
*/
long long int fiboI(int n){
    long long int a = 0, b = 1, c;
    int i = 2;
    if(n == 1)
        return a;
    else{
        if(n == 2)
            return b;
        else{
            while(i < n){
                c = a + b;
                a = b;
                b = c;
                i++;
            }
            return c;
        }
    }
}

int main () {

    int n = 50;
    time_t tIni, tFim;

    tIni = time(NULL); // obtem a hora do computador
    printf("Fibonacci iterativo: %lld\n", fiboI(n));
    tFim = time(NULL);
    printf("\tTempo em segundos: %f\n\n", difftime(tFim, tIni)); // diferença entre a hora de início e a hora de fim

    tIni = time(NULL);
    printf("Fibonacci recursivo: %lld\n", fiboR(n));
    tFim = time(NULL);
    printf("\tTempo em segundos: %f\n\n", difftime(tFim, tIni));

    return 0;
}

Deixe um comentário

três × 3 =

Wagner Gaspar

Capixaba de São Gabriel da Palha, Espírito Santo. Bacharel em Ciência da Computação pela Universidade Federal do Amazonas e mestre em informática pela Universidade Federal do Espírito Santo.