more efficient Lisp Fibonacci algorithm

The Fibonacci algorithm was inefficient because calculations
were repeated.  Performance is something much larger than O(n).

* (trace fib)
* (fib 5)
  0: (FIB 5)
    1: (FIB 4)
      2: (FIB 3)
        3: (FIB 2)
        3: FIB returned 1
        3: (FIB 1)
        3: FIB returned 1
      2: FIB returned 2
      2: (FIB 2)
      2: FIB returned 1
    1: FIB returned 3
    1: (FIB 3)
      2: (FIB 2)
      2: FIB returned 1
      2: (FIB 1)
      2: FIB returned 1
    1: FIB returned 2
  0: FIB returned 5
5
*

fibonnacci/lisp$ time ./run_comp.lisp

9227465
real	0m0.278s
user	0m0.272s
sys		0m0.004s
fibonnacci/lisp$

A version which only performs the calculation once can
be constructed which is much more efficient.
The performance is 0(n).  Also notice that it is not
tail recursive since the return value has to be propagated
back.

* (fib 5)
  0: (FIB 5)
    1: (FIB 4 1 1 2)
      2: (FIB 3 1 2 3)
        3: (FIB 2 2 3 5)
          4: (FIB 1 3 5 8)
            5: (FIB 0 5 8 13)
            5: FIB returned 5
          4: FIB returned 5
        3: FIB returned 5
      2: FIB returned 5
    1: FIB returned 5
  0: FIB returned 5
5
*

fibonnacci/lisp$ time ./run_comp.lisp

9227465
real	0m0.005s
user	0m0.004s
sys		0m0.000s
fibonnacci/lisp$