因此,我正在逐步研究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>
?
谢谢!
答案 0 :(得分:1)
#<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
。进行单个过程的全部目的是能够测试这些部分,以确保您可以确定它们是否起作用,并且可以在更高级别的抽象上使用它时停止考虑它的实现。