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;
}
