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

时间:2018-12-09 01:57:23

标签: function math error-handling functional-programming scheme

因此,我正在逐步研究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 个答案:

答案 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中,而不是improvegood-enoughabs。进行单个过程的全部目的是能够测试这些部分,以确保您可以确定它们是否起作用,并且可以在更高级别的抽象上使用它时停止考虑它的实现。