/* File: fibodeb.c */
/* Time-stamp: "2001-03-27 01:51:45 calvanes" */
/* Scopo: esempio di funzione ricorsiva con ricorsione multipla;
          versione adatta per seguire le attivazioni e visualizzare lo stack
          delle chiamate con il debugger
*/


/* Funzione ricorsiva che dato un numero i >= 0 calcola il numero di Fibonacci
   i-esimo:

   L'i-esimo numero di Fibonacci F(i) e` definito attraverso la seguente
   definizione induttiva:

     F(i) = 0                 se i = 0
     F(i) = 1                 se i = 1
     F(i) = F(i-1) + F(i-2)   se i >= 2
*/

#include <stdio.h>

long conta = 0;          /* contatore del numero di attivazioni di fibonacci */

long fibonacci(long i)
  /* Calcola l'i-esimo numero di Fibonacci.
     Si utilizza il tipo long in quanto i numeri di Fibonacci crescono molto
     velocemente.
  */
{
  long f1, f2, fibo;

  conta++;

  if (i == 0)
    fibo = 0;
  else if (i == 1)
    fibo = 1;
  else {
    f1 = fibonacci(i-1);
    f2 = fibonacci(i-2);
    fibo = f1 + f2;
  }

  return fibo;
}


int main(void)
{
  long n;

  printf("Inserire un intero >= 0: ");
  scanf("%ld", &n);
  printf("L' %ldo numero di Fibonacci e` %ld\n", n, fibonacci(n));
  printf("Il numero di attivazioni per calcolarlo e` %ld\n", conta);

  return 0;
}