# Scheme Programming/Memoisation

Memoization is a programming technique that allows programs to remember the results of prior computations. This technique has numerous benefits; here we will address its use in speeding up certain algorithms.

For example, the following program to compute Fibonacci numbers is correct, but slow:

```
(define fibonacci
(lambda (n)
(cond
((or (= n 1) (= n 2)) 1)
(else (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))))
```

Those with some understanding of analysis of algorithms will note that each call to (fibonacci n) for n > 2 requires two more calls of the fibonacci function, so the algorithm has a worst case running time of O(2^{n}). We can clearly do better. Observe that (fibonacci 1000) takes quite a while to compute, and may even crash your interpreter if it runs out of memory.