Recursion Scheme语言中的递归调用
我在读sicp,有一个问题(练习1.29),我写了一个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
(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!
。学习时提前跳过很少是一个好主意。非常感谢你的建议。但我只想知道上面我的函数发生了什么。为什么我的函数不起作用。我一步一步地分析和函数的作用,似乎没有问题,但无法得到正确的答案。奇怪的是,:(