这节开始介绍将用高阶函数做抽象的技术,比如将过程作为参数、返回值等等。习题1.30要求将书中的sum递归过程改造为迭代版本,解答如下:
测试一下,比如求pi的过程:
(sum 1 10):
=》 55
再提下1.29的题目,使用 辛普森规则计算定积分,一开始我没有使用sum过程,自己写了递归:
复用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 ))
( 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 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)
)
(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)))
(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)))