Posted on 2007-05-14 11:57
dennis 閱讀(708)
評論(0) 編輯 收藏 所屬分類:
計算機科學與基礎
這節開始介紹將用高階函數做抽象的技術,比如將過程作為參數、返回值等等。習題1.30要求將書中的sum遞歸過程改造為迭代版本,解答如下:
(define (sum-iter a term b next result)
(if (> a b)
result
(sum-iter (next a) term b next (+ result (term a)))))
(define (sum term a next b)
(sum-iter a term b next 0))
測試一下,比如求pi的過程:
(define (sum-integers a b)
(sum identity a inc b))
(sum 1 10):
=》 55
再提下1.29的題目,使用
辛普森規則計算定積分,一開始我沒有使用sum過程,自己寫了遞歸:
(define (simpson f a b n)
(define h (/ (- b a) n))
(define (simpson-term k)
(cond ((or (= k n) (= k 0)) (f (+ a (* k h))))
((even? k) (* 2 (f (+ a (* k h)))))
(else (* 4 (f (+ a (* k h)))))))
(define (simpson-temp f a b counter n)
(if (> counter n)
0
(+ (* (/ h 3.0) (simpson-term counter)) (simpson-iter f a b (+ counter 1) n))))
(simpson-temp f a b 0 n)
)
復用sum過程,也可以這樣寫:
(define (inc i) (+ i 1))
(define (simpson f a b n)
(define (simpson* h)
(define (mag k)
(cond ((or (= k 0) (= k n)) 1)
((odd? k) 4)
(else 2)))
(define (y k)
(f (+ a (* k h))))
(define (term k)
(* (mag k) (y k)))
(/ (* h (sum term
0
inc
n)) 3))
(simpson* (/ (- b a) n)))