SICP 习题1.8需要我们做的是按照牛顿法求平方根的方法做一个求立方根的过程。
所以说书中讲牛顿法求平方根的内容还是要好好理解,不然后面这几道题做起来就比较困难。
反过来,如果理解了牛顿法求平方根的方法,做出一个求立方根的过程就很容易了。当然,我们需要一个改进猜测的方法,就是improve那部分,如果要我自己想出来这个改进方法我觉得是有挑战性的,还好书中直接写出来了,就是:((x / (y * y) ) + ( 2 * y) ) / 3),其中y是猜测值,x是需要求立方根的数。
根据以上公式,我们定义一个next-try过程,相当于求平方根过程里的improve过程。
(define (next-try try-value x) (/ (+ (/ x (* try-value try-value)) (* 2 try-value)) 3))
接着是定义try-cube-root 过程,整个过程几乎和书中的sqrt-iter过程相同,就是看猜测结果是否足够好,如果不够好就通过new-try过程计算一个更好的猜测结果出来继续。
也正因为求平方根和求立方根的过程有这么多相似的代码,所以我们可以对这个过程进行抽象,形成一个应用范伟更广泛的过程。有关这一点书中很快就会开始讨论。
回到我们的题目,定义的try-cube-root过程如下:
(define (try-cube-root try-value x) (if (good-cube-root try-value x) try-value (try-cube-root (next-try try-value x) x)))
好,题目做完了,整体上还是比较简单,如果感觉这题比较难的,一般是因为没有理解牛顿法求平方根的部分,需要回到书中的正文去理解。