做个实验,依次求1的根,0.1的根,0.001 ... 很快就会发现结果稳定在0.3附近,当数足够小的时候,这个函数明显失灵了;
再试试大的数,10,100,1000 ... 当输入足够大,解释器陷入死循环;说明当数足够大的时候,这个函数也失灵了;
具体为什么,我还不能直观地理解。既然这个基本是个数学问题,我就暂时先不考虑了,有时间再研究。
但是后面的部分还是要做,判断两次迭代结果的差异来决定是否停止:
(define (square x)
(* x x) ) (define (good-enough last-guess this-guess) (< (abs(/ (- this-guess last-guess) last-guess)) 0.000001) ) (define (improve guess x) (/ (+ guess (/ x guess)) 2.0) ) // 引入一个新的参数,现在有两个猜测值了,分别表示上一次迭代的值和这一次迭代的值 (define (sqrt-iter last-guess this-guess x) (if (good-enough last-guess this-guess) this-guess (sqrt-iter this-guess (improve this-guess x) x) ) ) (define (my-sqrt x) (sqrt-iter 1.0 2.0 x))