Recursion Scheme语言中的递归调用

Recursion Scheme语言中的递归调用,recursion,lambda,scheme,Recursion,Lambda,Scheme,我在读sicp,有一个问题(练习1.29),我写了一个scheme函数来解决这个问题,但是函数的递归调用似乎得到了错误的答案。我真的很奇怪。代码如下: (define simpson (lambda (f a b n) (let ((h (/ (- b a) n)) (k 0)) (letrec ((sum (lambda (term start next end) (if (> start

我在读sicp,有一个问题(练习1.29),我写了一个scheme函数来解决这个问题,但是函数的递归调用似乎得到了错误的答案。我真的很奇怪。代码如下:

(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函数:

(辛普森(λ(x)x)0114)

我希望得到6,但它返回10给我,我不确定错误在哪里。在我看来,辛普森函数中定义的函数“sum”是不正确的


如果我使用迭代而不是递归重写simpson内部的求和函数,我会得到正确的答案

您需要将总和乘以
h/3

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

您需要将总和乘以
h/3

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

是的,我知道,但是sum应该返回6而不是10给我,这样我才能得到正确的答案。返回的金额是错误的。这对我来说真的很奇怪。我确信这个术语被调用了4次,它应该返回6次,但它没有。不管怎样,谢谢你的帮助。有人知道原因吗?一定是出了什么事,但我找不到。有人帮我…你能展示一下你预期结果的计算结果吗?是的,计算结果如下。是的,我知道,但是sum应该返回6而不是10给我,这样我才能得到正确的答案。返回的金额是错误的。这对我来说真的很奇怪。我确信这个术语被调用了4次,它应该返回6次,但它没有。不管怎样,谢谢你的帮助。有人知道原因吗?一定是出了什么事,但我找不到。有人帮你…你能展示一下你预期结果的计算吗?是的,计算如下。变异和递归是一个危险的组合。如果你在学习SICP,你不应该使用
let在第3章中介绍之前。学习时,提前跳绳很少是个好主意。非常感谢您的建议。但我只想知道我上面的函数发生了什么。为什么我的功能不起作用。我一步一步地分析和函数的作用,似乎没有问题,但不能得到正确的答案。真奇怪,:(变异和递归是一个危险的组合。如果你在学习SICP,在第3章中介绍之前,你根本不应该使用
let!
。学习时提前跳过很少是一个好主意。非常感谢你的建议。但我只想知道上面我的函数发生了什么。为什么我的函数不起作用。我一步一步地分析和函数的作用,似乎没有问题,但无法得到正确的答案。奇怪的是,:(