我正在尝试阅读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
答案 0 :(得分:0)
为结束这个问题,我将写一个正式的答案,而不是将其作为评论。
问题在于
(1)square-root-loop
在递归调用中的拼写错误,
它称为squre-root-loop
;
(2)缺少square
,应将其定义为(define (square x) (* x x))
。
请小心命名。
这些函数分别命名为sqrt
和square-root
,并使用相同的名称。
因此,square-root-loop
应该是sqrt-loop
。
某些函数名称包含对平方根的引用,其他则不包含。
显然,SICP直到很晚才引入letrec
,但是当您了解它时,请尝试将这些函数收集到一个内部范围中,并且仅让外部函数提及平方根,以避免冗余。