为什么在我的方案立方根程序中显示此错误?



所以我正在通过 SICP,其中一个问题 (1.8) 是使用牛顿-拉夫森方法实现类似于平方根过程的立方根过程。 我编写了程序并尝试执行它,但出现此错误:*: number required, but got #<Closure> [cubert, cubeiter, cubeiter, good-enough, cube, sq, *]

这是我的代码:

(define (sq x)
(* x x))
(define (cube x)
(*(sq x) x))
(define (abs x) 
(if (< x 0) 
(-x) 
x))
(define (good-enough guess x)
(< (abs (- x (cube guess)) )0.0001))
(define (improve guess x)
(- guess (/ (- (cube guess) 3) (* 3 (sq x)))))
(define (cubeiter guess x)
(if (good-enough guess x)
guess
(cubeiter improve x)))
(define (cubert x) (cubeiter 1.0 x))
(cubert 27)

任何人都可以解释此错误的含义以及我如何解决它吗? 什么是#<Closure>

提前感谢!

#<Closure>是表示过程对象的实现方法。如果x计算结果,则(x ...)调用该过程。例如。(+ 2 3) ; ==> 5,但+ ; ==> #<Closure>.(+是基元,因此可能会以不同的方式显示,但这实际上无关紧要。您不应该打印它:)

)我看到你打电话给(cubeiter improve x),但guess应该是一个过程似乎不正确,因为初始调用通过1.0这是一个数字。显然,其中一个是错误的。也许你应该打电话给improve,结果是传递给cubeiter?例如。(cubeiter (improve ...) x)

您在abs中也有错误。(-x)(- x)不同, 是(- 0 x)的缩写。您正在调用一个名为-x的过程,没有参数。

abs错误使我认为您可能没有测试代码的各个部分。如果你不是,一旦基于代码变大,你就会遇到问题。在制作cubeiter时,很高兴知道您在其中使用的程序有效,并且错误很可能是cubeiter而不是improvegood-enoughabs。制作单个过程的全部意义在于能够测试这些部分,以便您确定它有效,并且在更高抽象级别上使用它时可以停止考虑它的实现。