// fib.c #include #include #include #include int fib(int n) { if(n <= 0) { return 0; } else if(n == 1) { return 1; } else { return fib(n-1) + fib(n-2); } } int FibHash[100]; // uses memoization int memoFib(int n) { int ret; // what happens if you leave out this line? if (n < 1) return 0; if(FibHash[n]) { return FibHash[n]; } else { ret = memoFib(n-1) + memoFib(n-2); FibHash[n] = ret; return ret; } } // uses dynamic programming int fib2(int n) { int *a; int i; int ret; if(n < 2) { return 1; } else { a = malloc(sizeof(*a) * (n+1)); assert(a); a[0] = a[1] = a[2] = 1; for(i = 3; i <= n; i++) { a[i] = a[i-1] + a[i-2]; } } ret = a[n]; free(a); return ret; } int main(int argc, char ** argv){ if (argc == 1) { fprintf(stderr, "Usage: fib [integers]+\n"); exit(1); } FibHash[0] = 0; FibHash[1] = 1; for (int k = 2; k < 100; k++) FibHash[k] = 0; clock_t t; double time_taken; for (int i = 1; i < argc; i++){ int j = atoi(argv[i]); if (j > 0) { t = clock(); printf("fib(%d) = %d \t", j, fib(j)); t = clock() - t; time_taken = ((double) t)/CLOCKS_PER_SEC; printf("Time: %f\n", time_taken); t = clock(); printf("memoFib(%d) = %d \t", j, memoFib(j)); t = clock() - t; time_taken = ((double) t)/CLOCKS_PER_SEC; printf("Time: %f\n", time_taken); t = clock(); printf("fib2(%d) = %d \t", j, fib2(j)); t = clock() - t; time_taken = ((double) t)/CLOCKS_PER_SEC; printf("Time: %f\n", time_taken); } } return (0); }