首先,将题目给定的算式 \(\frac{x/y^2+2y}{3}\) 转换成前序表达式:
(/ (+ (/ x (square y)) (* 2 y))
3)
然后将这个表达式应用到 improve
函数,再修改一下 sqrt
函数(书本 15 页),就可以得出计算三次方根的函数 cube-root
:
;;; 8-cube-root.scm
(load "8-cube.scm")
(define (cube-root x)
(cube-root-iter 1.0 x))
(define (cube-root-iter guess x) ; 和 sqrt-iter 是一样的
(if (good-enough? guess x) ; 改个名字,方便区别
guess
(cube-root-iter (improve guess x)
x)))
(define (good-enough? guess x) ; 要用 cube 来检测是否足够好
(< (abs (- (cube guess) x))
0.001))
(define (improve guess x) ; 题目给出的公式
(/ (+ (/ x (square guess)) (* 2 guess))
3))
要注意 cube-root
和 sqrt
两个函数之间的细微区别,小心别把它们混淆了。
因为 MIT Scheme 里没有计算立方的 cube
函数,所以需要自己写一个:
;;; 8-cube.scm
(define (cube x)
(* x x x))
最后,测试 cube-root
函数:
1 ]=> (load "8-cube-root.scm")
;Loading "8-cube-root.scm"...
; Loading "8-cube.scm"... done
;... done
;Value: improve
1 ]=> (cube-root (* 3 3 3))
;Value: 3.0000005410641766
1 ]=> (cube-root (* 5 5 5))
;Value: 5.000000000287929
1 ]=> (cube-root (* 7 7 7))
;Value: 7.000001795382107