• SICP 习题 (1.7) 解题总结


    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)
    	(if (is-small-part-of? (- previous-guess guess) previous-guess)
    	guess
    	(new-sqrt-iter (improve guess x) x guess)))
    


    做完拿以下代码测试一下,看结果相对于sqrt-iter是否有改进:

    (new-sqrt-iter 1.0 0.00000016 0.00000016)


    注意这里的new-sqrt-iter调用的第三个参数,因为第三个参数是上一次猜测的平方根,当我们第一次猜测时没有上一次,所以选一个和当前猜测数1相差比较大的数就好了。

    这题做起来比较简单一点,因为没涉及到太多复杂的数学问题。

  • 相关阅读:
    navigator
    windows事件
    js 数组
    类,屏蔽鼠标右键
    document.links[i].onclick;展示表单的输入
    手机端取消文字选中、取消图片长按下载
    ios显示一个下载banner
    js时间Date对象介绍及解决getTime转换为8点的问题
    iphone的click导致div变黑
    如何给外部引用的js文件传递参数
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3285775.html
Copyright © 2020-2023  润新知