因此,我正在通过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>
?提前致谢!
最佳答案
#<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
而不是improve
,good-enough
或abs
。进行单个过程的全部目的是能够测试各个部分,以确保可以正常运行,并且可以在更高级别的抽象上使用它时停止考虑它的实现。