(load "2d-table.scm") ;; space-saving fibonacci (define fib-best (lambda (n) (if (< n 2) n (do ((i 2 (+ i 1)) (minus1 1 (+ minus1 minus2)) (minus2 0 minus1)) ((= i n) (+ minus1 minus2)))))) ;; memoized choose (define mchoose (lambda (n k) (let ((T (make-table (+ n 1) (+ k 1)))) (define memoize (lambda (i j) (if (not (table-ref T i j)) (table-set! T i j (cond ((= i j) 1) ((= j 0) 1) (else (+ (memoize (- i 1) (- j 1)) (memoize (- i 1) j)))))) (table-ref T i j))) (table-fill! T #f) (memoize n k)))) ;; computing 2^n by dynamic programing (define dg (lambda (n) (let ((T (make-vector (+ n 1)))) (do ((i 0 (+ i 1))) ((> i n) (vector-ref T n)) (vector-set! T i (if (= i 0) 1 (* 2 (vector-ref T (- i 1)))))))))