/* * Demonstrate that recursion can be slow * * gcc -o fibonacci fibonacci.c my_timing.c */ #include #include "my_timing.h" /* recursive method: double recursion, variable n grows exponentially */ unsigned long FibonacciR (unsigned n) { if (n > 2) return FibonacciR(n-1) + FibonacciR(n-2); else return 1; } /* without recursion */ unsigned long Fibonacci (unsigned n) { if (n <= 1) { return n; } unsigned long curr = 1; unsigned long prev = 1; for (int i = 2; i < n; ++i) { unsigned long temp = curr; curr += prev; prev = temp; } return curr; } long SumR( long n ) { if (n == 0 || (n > 100000 && n % 100 == 0)) { printf( "n=%ld @%p\n", n, &n ); } if (n < 1) { return 0; } else { return SumR( n-1 ) + n; } } long Sum( long n ) { long ret = 0; for (int i = 1; i < n; i++) { ret += i; } return ret; } int main () { double t1, t2, t3; unsigned d; printf( "Enter desired Fibonacci number: "); while (scanf("%d", &d) != 0) { printf("Entered: %d\n", d); t1 = get_time_sec(); unsigned i = FibonacciR(d); // unsigned i = SumR(d); // unsigned i = 0; t2 = get_time_sec(); unsigned j = Fibonacci(d); // unsigned j = Sum(d); t3 = get_time_sec(); printf("FibonacciR number is: %u, Time: %f sec\n", i, t2 - t1); printf("Fibonacci number is: %u, Time: %f sec\n", j, t3 - t2); printf( "Enter desired Fibonacci number: "); } return 0; }