sicp 习题1.30,1.29解答

    这节开始介绍将用高阶函数做抽象的技术,比如将过程作为参数、返回值等等。习题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)))




117300.html

dennis 2007-05-14 11:57 发表评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值