庄周梦蝶

生活、程序、未来
   :: 首页 ::  ::  :: 聚合  :: 管理

sicp 习题1.30,1.29解答

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





只有注册用户登录后才能发表评论。


网站导航: