(define (make-table) (cons '() '()))
(define (lookup wat table)
  (let ((answer (assoc wat (car table))))
    (if answer
        (cdr answer)
        #f)))
(define (insert! wat1 wat2 table)
  (set-car! table (cons (cons wat1 wat2) (car table))))
;(define (memoize f)
;  (let ((table (make-table)))
;    (define (lookup-or-compute x)
;      (let ((previously-computed-result (lookup x table)))
;        (if (not (null? previously-computed-result))
;            previously-computed-result
;            (let ((result (f x)))
;              (insert! x result table)
;              result))))
;    lookup-or-compute))
(define (memoize f)
  (let ((table (make-table)))
    (define (lookup-or-compute x)
      (let ((previously-computed-result (lookup x table)))
        (if (not (null? previously-computed-result))
            (begin
              (display "Memo-fib ")
              (display x)
              (display " uit tabel")
              (newline)
              previously-computed-result)
            (begin
              (display "Memo-fib ")
              (display x)
              (display " berekent")
              (newline)
              (let ((result (f x)))
                (insert! x result table)
                result)))))
    lookup-or-compute))
(define memo-fib
  (memoize
    (lambda (n)
      (cond ((= n 0) 0)
            ((= n 1) 1)
            (else (+ (memo-fib (- n 1))
                     (memo-fib (- n 2))))))))
(define (fib n)
  (cond ((= n 0) 0)
        ((= n 1) 1)
        (else (+ (fib (- n 1))
                 (fib (- n 2))))))
Memo-fib 3 berekent
Memo-fib 2 berekent
Memo-fib 1 berekent
Memo-fib 0 berekent
Memo-fib 1 uit tabel