/* File: fib2.c
   A recursive function for Fibonacci numbers
   using a memoization table.
*/

#include <stdio.h>
#include <malloc.h>


int rec_fib(int n, int *T) {

   if (T[n] > 0) return T[n] ;

   return T[n] = rec_fib(n-1,T) + rec_fib(n-2,T) ;
}


int fib(int n) {
   int *T, i ;

   if (n <= 1) return 1;

   T = (int *) malloc(sizeof(int)*(n+1)) ;
   if (T == NULL) abort() ;

   for (i = 0 ; i <= n ; i++) {
      T[i] = -1 ;
   }
   T[0] = T[1] = 1 ;
   
   return rec_fib(n, T) ;
}

main(int argc, char *argv[]) {
   int n, r ;

   if (argc !=2) {
      printf("Wrong number of arguments!\n") ;
      exit() ;
   }

   r = sscanf(argv[1],"%d", &n) ;
   if (r != 1) {
      printf("Need an integer argument!\n") ;
      exit() ;
   }

   printf("Fib(%d) = %d\n", n, fib(n)) ;
}
