Posted on 2007-05-14 11:57
dennis 阅读(703)
评论(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)))