首页 文章

为什么我的Scheme Cube-Root程序中出现此错误?

提问于
浏览
1

所以我正在通过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 回答

  • 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 而不是 improvegood-enoughabs . 然后制定个别程序的全部要点是能够测试这些部件,以确保它能够正常工作,并且在更高的抽象级别上使用它时,您可以停止考虑它的实现 .

相关问题