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