#include <stdio.h>
#include <stdlib.h>
#define CONTABILIZA
unsigned long fibonacciRec(int n)
{
#ifdef CONTABILIZA
static unsigned long chamadas = 0;
if(n == -1)
return chamadas = 0;
if(n == -2)
return chamadas;
chamadas++;
#endif
if(n < 2)
return 1UL;
return fibonacciRec(n-1) + fibonacciRec(n-2);
}
unsigned long fibonacci(int n)
{
int i;
unsigned long fn1, fn2, fn;
fn = fn1 = fn2 = 1UL;
for(i = 2; i <= n; i++)
{
fn = fn1 + fn2;
fn2 = fn1;
fn1 = fn;
}
return fn;
}
int main(int argc, char *argv[])
{
int n, res;
#ifdef CONTABILIZA
printf("Numero de chamadas da funcao Fibonacci recursiva.\n");
#endif
printf("Qual o valor n? ");
while((res = scanf("%d", &n)) != 1 && res != EOF)
/* Nada */;
if(res == EOF)
return EXIT_FAILURE;
#ifdef CONTABILIZA
/* Anula contador: */
fibonacciRec(-1);
#endif
/* Calcula Fibonacci: */
printf("F(%d) = %lu\n", n, fibonacciRec(n));
#ifdef CONTABILIZA
/* Imprime numero de chamadas: */
printf("chamadas = %lu\n", fibonacciRec(-2));
#endif
return EXIT_SUCCESS;
}