用Scheme语言

时间:2017-10-01 04:22:01

标签: recursion lambda scheme

我正在阅读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给我,我不知道错误在哪里。在我看来,Simpson函数内定义的函数“sum”是不对的。

如果我使用迭代而不是递归重写simpson中的sum函数,我会得到正确的答案。

1 个答案:

答案 0 :(得分:0)

您需要将总和乘以h/3

 (* 1/3 h (sum term a next b))