SICP(MIT-Scheme)平方根过程

时间:2018-07-10 07:32:55

标签: scheme lisp sicp mit-scheme

我正在尝试阅读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.

代码与书中的代码几乎完全一样,所以我不知道这是怎么回事。 (在定义完这些程序后,我已经将它们传递给了评估者,因此应该对其进行定义。“ abs”也已经被定义。)

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

1 个答案:

答案 0 :(得分:0)

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

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

请小心命名。 这些函数分别命名为sqrtsquare-root,并使用相同的名称。 因此,square-root-loop应该是sqrt-loop

某些函数名称包含对平方根的引用,其他则不包含。 显然,SICP直到很晚才引入letrec,但是当您了解它时,请尝试将这些函数收集到一个内部范围中,并且仅让外部函数提及平方根,以避免冗余。