Skip to content

Instantly share code, notes, and snippets.

@mahata
Created December 27, 2011 01:23
Show Gist options
  • Select an option

  • Save mahata/1522455 to your computer and use it in GitHub Desktop.

Select an option

Save mahata/1522455 to your computer and use it in GitHub Desktop.
memoize @ SICP
(define (memoize f)
(let ((table (make-table)))
(lambda (x)
(let ((previously-computed-result (lookup x table)))
(or previously-computed-result
(let ((result (f x)))
(insert! x result table)
result))))))
(define (lookup key table)
(let ((record (assoc key (cdr table))))
(if record
(cdr record)
#f)))
(define (assoc key records)
(cond ((null? records) #f)
((equal? key (caar records)) (car records))
(else (assoc key (cdr records)))))
(define (insert! key value table)
(let ((record (assoc key (cdr table))))
(if record
(set-cdr! record value)
(set-cdr! table
(cons (cons key value) (cdr table)))))
'ok)
(define (make-table)
(list '*table*))
(define (fib n)
(cond ((= n 0) 0)
((= n 1) 1)
(else (+ (fib (- n 1))
(fib (- n 2))))))
(define memo-fib
(memoize (lambda (n)
(cond ((= n 0) 0)
((= n 1) 1)
(else (+ (memo-fib (- n 1))
(memo-fib (- n 2))))))))
(memo-fib 3) ;=> 2
(memo-fib 4) ;=> 3
(memo-fib 5) ;=> 5
(memo-fib 6) ;=> 8
(memo-fib 7) ;=> 13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment