因此,我正在通过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而不是improvegood-enoughabs。进行单个过程的全部目的是能够测试各个部分,以确保可以正常运行,并且可以在更高级别的抽象上使用它时停止考虑它的实现。

09-04 18:14