1. 程式人生 > >SICP_3.27

SICP_3.27

soc fine false -1 工作 else ati n-2 n-1

 1 (define false #f)
 2 (define true #t)
 3 
 4 (define (make-table)
 5   (let ((local-table (list *table*)))
 6 
 7      (define (assoc key records)
 8       (cond ((null? records) false)
 9             ((equal? (caar records) key) (car records))
10             (else (assoc key (cdr records)))))
11
12 (define (lookup keys) 13 (define (lookup-helper keys table) 14 (let ((subtable (assoc (car keys) (cdr table)))) 15 (if subtable 16 (if (null? (cdr keys)) 17 (cdr subtable) 18 (lookup-helper (cdr keys) subtable)) 19 false
))) 20 (lookup-helper keys local-table)) 21 22 (define (insert! keys value) 23 (define (insert-helper! keys table) 24 (if (null? table) 25 (if (null? (cdr keys)) 26 (cons (car keys) value) 27 (list (car keys) (insert-helper! (cdr keys)
()))) 28 (let ((sub (assoc (car keys) (cdr table)))) 29 (if sub 30 (if (null? (cdr keys)) 31 (set-cdr! sub value) 32 (insert-helper! (cdr keys) sub)) 33 (if (null? (cdr keys)) 34 (set-cdr! table (cons (cons (car keys) value) (cdr table))) 35 (set-cdr! table (cons 36 (list (car keys)(insert-helper! (cdr keys) ())) 37 ;;可以直接用(insert-helper! keys ()) 38 (cdr table)))))))) 39 (insert-helper! keys local-table) 40 ok) 41 42 (define (dispatch m) 43 (cond ((eq? m lookup-proc) lookup) 44 ((eq? m insert-proc) insert!) 45 (else (error "Unknow operation --TABLE" m)))) 46 47 dispatch)) 48 49 (define (lookup x table) 50 (let ((keys (list x))) 51 ((table lookup-proc) keys))) 52 53 (define (insert! x result table) 54 (let ((keys (list x))) 55 ((table insert-proc) keys result))) 56 57 ;;;;;;;;;;;;;;;;;;;;;;;;;;;; 58 59 (define (memoize f) 60 (let ((table (make-table))) 61 (lambda (x) 62 (let ((previously-computed-result (lookup x table))) 63 (or previously-computed-result 64 (let ((result (f x))) 65 (insert! x result table) 66 result)))))) 67 68 69 (define memo-fib 70 (memoize (lambda (n) 71 (cond ((= n 0) 0) 72 ((= n 1) 1) 73 (else (+ (memo-fib (- n 1)) 74 (memo-fib (- n 2)))))))) 75 76 77 (memo-fib 0)

簡單的定義為

(memoize fib)

能工作,但這樣並沒有意義,因為這樣定義在處理 fib(n-2)和fib(n-1)時就是普通fib函數了

步數:

在計算fib(n)時 需要fib(n-1)和fib(n-2)而fib(n-1)的值需要fib(n-2)的值,如使用記憶法,則fib(n-2),fib(n-3)已事先存在表中。所以事先

要計算fib(n-2),一直到達n=0 和 n=1時整個表都被填滿,總的來看就是求一遍fib(2)到fib(n-1)所以需要O(n)步來計算fib(n)。

SICP_3.27