【问题标题】:Why is this error in my Scheme Cube-Root program showing up?为什么我的 Scheme Cube-Root 程序中出现此错误?
【发布时间】:2019-05-10 08:30:28
【问题描述】:

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

谁能解释这个错误的含义以及我该如何解决它? #&lt;Closure&gt;是什么?

提前致谢!

【问题讨论】:

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


    【解决方案1】:

    #&lt;Closure&gt; 是表示过程对象的实现方法。如果 x 的计算结果为,则 (x ...) 调用该过程。例如。 (+ 2 3) ; ==&gt; 5,但+ ; ==&gt; #&lt;Closure&gt;。 (+ 是一个原语,所以它可能会显示不同,但这并不重要。你不应该打印它:))

    我看到你打电话给(cubeiter improve x),但guess 应该是一个过程似乎不正确,因为初始调用通过1.0 这是一个数字。显然其中一个是错误的。或许您应该调用improve 并将结果传递给cubeiter?例如。 (cubeiter (improve ...) x)

    您在abs 中也有错误。 (-x)(- x) 不同,后者是(- 0 x) 的缩写。您正在调用一个名为-x 的过程,不带任何参数。

    abs 错误让我认为您可能没有测试您的代码部分。如果你不是,一旦基于代码变得更大,你就会遇到问题。在制作cubeiter 时,很高兴知道您在其中使用的程序有效,并且错误很可能出现在cubeiter 而不是improvegood-enoughabs。制作单个程序的全部意义在于能够测试各个部分,以确保它可以正常工作,并且在更高的抽象级别上使用它时可以不再考虑它的实现。

    【讨论】:

      猜你喜欢
      • 2021-08-11
      • 1970-01-01
      • 1970-01-01
      • 2014-11-30
      • 2013-09-15
      • 2011-03-24
      • 1970-01-01
      • 2018-01-20
      • 1970-01-01
      相关资源
      最近更新 更多