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))
.
注意命名。
这些函数都命名为 sqrt
和 square-root
,使用相同的名称。
所以,square-root-loop
应该是 sqrt-loop
.
一些函数名称包括对平方根的引用,而另一些则没有。
显然,SICP很晚才引入letrec
,但当你了解它时,尽量将函数集中到一个内部范围内,只让外部函数提及平方根以避免冗余。
我正在尝试阅读 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))
.
注意命名。
这些函数都命名为 sqrt
和 square-root
,使用相同的名称。
所以,square-root-loop
应该是 sqrt-loop
.
一些函数名称包括对平方根的引用,而另一些则没有。
显然,SICP很晚才引入letrec
,但当你了解它时,尽量将函数集中到一个内部范围内,只让外部函数提及平方根以避免冗余。