SICP 习题 1.7 是对正文1.1.7节中的牛顿法求平方根的改进,改进部分是good-enough?过程。
原来的good-enough?是判断x和guess平方的差值是否小于0.001,这个过程在一般情况下没什么问题,但是,当需要求平方根的目标本身比较小时就会出现问题。
比如我们求(sqrt-iter 1.0 0.00000016),我们口算都知道结果是0.0004,但是(sqrt-iter)返回的结果大概是0.03125,因为0.03125的平方是.0009765625 ,这个数本身就小于0.001,所以它和0.00000016的差值当然也小于0.001。
题中提到的更好的方法应该是计算两次猜测的差值相对于上次猜测的比例,用一般数学公式表示就是( (guess - previous-guess) / previous-guess)这个数要足够小。
理清了这个思路做起程序来就很方便了,首先定义is-small-part-of?过程如下:
(define (is-small-part-of? small-one big-one)
(< (abs (/ small-one big-one)) 0.001))
然后修改sqrt-iter为:
(define (new-sqrt-iter guess x previous-guess)

SICP 习题 1.7 改进了原始牛顿法求平方根中的good-enough?过程。原来的方法在目标值较小时可能出错。改进方法是通过计算连续两次猜测值的比例来判断是否足够接近真实值。通过定义is-small-part-of?过程,并更新sqrt-iter,实现了更准确的平方根计算。
最低0.47元/天 解锁文章
307

被折叠的 条评论
为什么被折叠?



