SICP (MIT-Scheme) 平方根程序

SICP (MIT-Scheme) Square Root procedure

我正在尝试阅读 SICP 这本书,但我 运行 在尝试实现书中列出的平方根方法时遇到了问题。

我的代码:

(define (square-root-loop g x)
  (if (good-enough? g x)
   g
   (squre-root-loop (improve-sqrt-guess g x)
           x)))

(define (improve-sqrt-guess g x)
  (average-guess g (/ x g)))

(define (average-guess x y)
    (/ (+ x y) 2))

(define (good-enough? g x)
  (< (abs (- (square g) x)) 0.001))

(define (sqrt x)
  (square-root-loop 1.0 x))

然而,当我调用 sqrt 过程时,例如: (sqrt 9) ,我得到以下错误:

;Unbound variable: squre-root-loop
;To continue, call RESTART with an option number:
; (RESTART 11) => Specify a value to use instead of squre-root-loop.
; (RESTART 10) => Define squre-root-loop to a given value.
; (RESTART 9) => Return to read-eval-print level 9.
; (RESTART 8) => Return to read-eval-print level 8.
; (RESTART 7) => Return to read-eval-print level 7.
; (RESTART 6) => Return to read-eval-print level 6.
; (RESTART 5) => Return to read-eval-print level 5.
; (RESTART 4) => Return to read-eval-print level 4.
; (RESTART 3) => Return to read-eval-print level 3.
; (RESTART 2) => Return to read-eval-print level 2.
; (RESTART 1) => Return to read-eval-print level 1.

代码和书上的差不多,所以我不知道怎么回事。 (程序定义好后传给了Evaluator,应该定义好了。'abs'也已经定义好了。)

我正在 运行在 emacs 上使用 MIT-Scheme。 Screenshot

为了结束这个问题,我将写一个正式的答案,而不是将答案作为评论。

问题是 (1) square-root-loop 在递归调用中拼写错误, 它被称为squre-root-loop; (2)缺少square,应该定义为(define (square x) (* x x)).

注意命名。 这些函数都命名为 sqrtsquare-root,使用相同的名称。 所以,square-root-loop 应该是 sqrt-loop.

一些函数名称包括对平方根的引用,而另一些则没有。 显然,SICP很晚才引入letrec,但当你了解它时,尽量将函数集中到一个内部范围内,只让外部函数提及平方根以避免冗余。