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)))






dennis 2007-05-14 11:57 发表评论

你可能感兴趣的:(F#)