sicp 習(xí)題1.30,1.29解答
Posted on 2007-05-14 11:57 dennis 閱讀(712) 評(píng)論(0) 編輯 收藏 所屬分類: 計(jì)算機(jī)科學(xué)與基礎(chǔ) 這節(jié)開(kāi)始介紹將用高階函數(shù)做抽象的技術(shù),比如將過(guò)程作為參數(shù)、返回值等等。習(xí)題1.30要求將書中的sum遞歸過(guò)程改造為迭代版本,解答如下:
測(cè)試一下,比如求pi的過(guò)程:
(sum 1 10):
=》 55
再提下1.29的題目,使用辛普森規(guī)則計(jì)算定積分,一開(kāi)始我沒(méi)有使用sum過(guò)程,自己寫了遞歸:
復(fù)用sum過(guò)程,也可以這樣寫:
(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))
(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))
測(cè)試一下,比如求pi的過(guò)程:
(define (sum-integers a b)
(sum identity a inc b))
(sum identity a inc b))
(sum 1 10):
=》 55
再提下1.29的題目,使用辛普森規(guī)則計(jì)算定積分,一開(kāi)始我沒(méi)有使用sum過(guò)程,自己寫了遞歸:
(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)
)
(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)
)
復(fù)用sum過(guò)程,也可以這樣寫:
(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)))
(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)))