所以我正在通过SICP,其中一个问题(1.8)是使用Newton-Raphson method实现类似于平方根过程的立方根程序 . 我编写了程序并尝试执行它,但得到了这个错误: *: 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>
?
提前致谢!
1 回答
#<Closure>
是表示过程对象的实现方法 . 如果x
评估为那,则(x ...)
调用该过程 . 例如 .(+ 2 3) ; ==> 5
,但+ ; ==> #<Closure>
. (+
是一个原始的,所以它可能显示不同,但它确实无关紧要 . 你不应该打印它:))我看到你调用了
(cubeiter improve x)
,但是由于初始调用传递1.0
这是一个数字,因此guess
应该是一个程序似乎不正确 . 显然其中一个是错的 . 也许你应该调用improve
并将结果传递给cubeiter
?例如 .(cubeiter (improve ...) x)
你在
abs
也有错误 .(-x)
与(- x)
不同,(- x)
是(- 0 x)
的缩写 . 您正在调用一个名为-x
且没有参数的过程 .abs
错误使我认为您可能没有测试代码的各个部分 . 如果你不是,那么一旦基于代码变大,你就会遇到问题 . 在制作cubeiter
时,很高兴知道你在其中使用的程序有效,然后错误最有可能出现在cubeiter
而不是improve
,good-enough
或abs
. 然后制定个别程序的全部要点是能够测试这些部件,以确保它能够正常工作,并且在更高的抽象级别上使用它时,您可以停止考虑它的实现 .