我正在阅读SICP,有一个问题(练习1.29),我编写了一个方案函数来解决问题,但是似乎该函数的递归呼叫得到了错误的答案。对我来说真的很奇怪。代码如下:
(define simpson
(lambda (f a b n)
(let ((h (/ (- b a) n))
(k 0))
(letrec
((sum (lambda (term start next end)
(if (> start end)
0
(+ (term start)
(sum term (next start) next end)))))
(next (lambda (x)
(let ()
(set! k (+ k 1))
(+ x h))))
(term (lambda (x)
(cond
((= k 0) (f a))
((= k n) (f b))
((even? k) (* 2
(f x)))
(else (* 4
(f x)))))))
(sum term a next b)))))
我没有得到正确的答案。
例如,如果我尝试以这样的方式调用Simpson功能:
(simpson (lambda (x) x) 0 1 4)
我希望能得到6,但它返回了10,我不确定错误在哪里。在我看来,辛普森函数内部定义的" sum"不正确。
如果我使用迭代而不是递归来重写Simpson内部的总和函数,我会得到正确的答案。
您需要将总和乘以h/3
:
(* 1/3 h (sum term a next b))