Fork me on GitHub

特殊形式(special form):

1 (lambda (<formal-parameters>) <body>)
2 (let ((<var1> <exp1>)
3       ...
4       (<varn> <expn>))
5     <body>)

等价形式:

 1 (define (plus4 x) (+ x 4))
 2 等价于
 3 (define plus4 (lambda (x) (+ x 4)))
 4 
 5 (let ((<var1> <exp1>)
 6         ...
 7       (<varn> <expn>))
 8     <body>)
 9 等价于
10 ((lambda (<var1> ... <varn>)
11     <body>)
12     <exp1> ... <expn>)

 

范例:区间折半法找方程的根

 1 (define (average x y)
 2     (/ (+ x y) 2))
 3 (define (close-enough? x y)
 4     (< (abs (- x y)) 0.0001))
 5 
 6 (define (search f neg-point pos-point)
 7     (let ((midpoint (average neg-point pos-point)))
 8         (if (close-enough? neg-point pos-point)
 9             midpoint
10             (let ((test-value (f midpoint)))
11                 (cond ((positive? test-value) (search f neg-point midpoint))
12                       ((negative? test-value) (search f midpoint pos-point))
13                       (else midpoint))))))
14 
15 (define (half-interval-method f a b)
16     (let ((a-value (f a))
17           (b-value (f b)))
18         (cond ((and (negative? a-value) (positive? b-value)) (search f a b))        
19               ((and (negative? b-value) (positive? a-value)) (search f b a))
20               (else (error "Values are not of opposite sign." a b)))))

 范例:找出函数不动点

 1 (define (tolerance 0.00001)
 2 (define (fixed-point f first-guess)
 3     (define (close-enough? v1 v2)
 4         (< (abs (- v1 v2)) tolerance))
 5     (define (try guess)
 6         (let ((next (f guess)))
 7             (if (close-enough? guess next)
 8                 next
 9                 (try next))))
10     (try first-guess))

部分习题:

exercise 1.29

 1 (define (inc x)
 2     (+ x 1))
 3 (define (cube x)
 4     (* x x x))
 5 (define (sum term a next b)
 6     (if (> a b)
 7         0
 8         (+ (term a)
 9            (sum term (next a) next b))))
10 (define (simpson-integral f a b n)
11     (define h (/ (- b a) n))
12     (define (y k)
13         (f (+ a (* h k))))
14     (define (term k)
15         (cond ((or (= k 0) (= k n)) (y k))
16               ((even? k) (* (y k) 2))
17               (else (* (y k) 4))))
18     (* (sum term 0 inc n)
19         (/ h 3)))

exercise 1.30

1 (define (sum term a next b)
2     (define (sum-iter a result)
3         (if (> a b)
4             result
5             (sum-iter (next a) (+ result (term a)))))
6     (sum-iter a 0))

exercise 1.31

 1 (define (inc x) (+ x 1))
 2 (define (identity x) x)
 3 ; recursive product
 4 (define (product term a next b)
 5     (if (> a b)
 6         1
 7         (* (term a)
 8            (product term (next a) next b))))
 9 
10 (define (factorial n)
11     (product identity 1 inc n))
12 
13 (define (quarter-pi n)
14     (define (term k)
15         (if (even? k)
16             (/ (+ k 2.0) (+ k 3.0))
17             (/ (+ k 3.0) (+ k 2.0))))
18     (product term 0 inc n))
19 
20 ; iterative product
21 (define (product term a next b)
22     (define (product-iter a result)
23         (if (> a b)
24             result
25             (product-iter (next a) (* (term a) result))))
26     (product-iter a 1))

 exercise 1.32

 1 ;recursive process
 2 (define (accumulate combiner null-value term a next b)
 3     (if (> a b)
 4         null-value
 5         (combiner (term a)
 6                   (accumulate combiner null-value term (next a) next b))))
 7 ;iterative process
 8 (define (accumulate combiner null-value term a next b)
 9     (define (accumulate-iter a result)
10         (if (> a b)
11             result
12             (accumulate-iter (next a)
13                              (combiner (term a) result))))
14     (accumulate-iter a null-value))
15 
16 ;sum
17 (define (sum term a next b)
18     (accumulate + 0 term a next b))
19 ;product
20 (define (product term a next b)
21     (accumulate * 1 term a next b))

 exercise 1.33

1 (define (accumulate-filter combiner null-value term a next b filter)
2     (if (> a b)
3         null-value
4         (if (filter (term a))
5             (combiner (term a)
6                       (accumulate-filter combiner null-value term (next a) next b filter))
7        (combiner null-value
8              (accumulate-filter combiner null-value term (next a) next b filter)))))

exercise 1.34

代换模型如下:

1 (f f)
2 (f 2)
3 (2 2)

exercise 1.35

1 (define (golden-ratio)
2     (fixed-point (lambda (x) (+ 1 (/ 1 x)))
3                  1.0))

exercise 1.36

 1 (define tolerance 0.0001)
 2 (define (fixed-point f first-guess)
 3     (define (close-enough? v1 v2)
 4         (< (abs (- v1 v2)) tolerance))
 5     (define (try guess)
 6         (newline)
 7         (display guess)
 8         (let ((next (f guess)))
 9             (if (close-enough? guess next)
10                 next
11                 (try next))))
12     (try first-guess))

 设初始猜测值为 x1 且x1 != 1。则x2 = log(1000) / log(x1),x3 = log(x1),可以看到猜测值不停在 log(1000) / log(x1) 和 log(x1) 之间往复。

1 (define (f)
2     (fixed-point (lambda (x) (average (/ (log 1000) (log x))
3                                       (log x)))
4                  2.0))

 exercise 1.37

 1 ; recursive procedure
 2 (define (cont-frac n d k)
 3     (define (loop index)
 4        (if (= index k)
 5         0
 6         (/ (n index)
 7           (+ (d index) (loop (+ index 1))))))
 8   (loop 1))
 9 
10 
11 ; iterative procedure
12 (define (cont-frac n d k)
13    (define (loop-iter index result)
14       (if (= index k)
15         result
16         (loop-iter (+ index 1)
17                (/ (n index)
18                  (+ (d index) result)))))
19    (loop-iter 1 0))

exercise 1.38

 1 (define (d-item k)
 2     (cond ((= k 0) 0)
 3            ((= (remainder (+ k 1) 3) 0) 
 4             (expt 2 (/ (+ k 1) 3)))
 5            (else 1)))
 6 (define (euler k)
 7     (+ (cont-frac (lambda (i) 1.0)
 8                   d-item
 9                   k)
10         2.0))

 

 

posted on 2012-11-02 00:23  sungoshawk  阅读(278)  评论(0编辑  收藏  举报