zoukankan      html  css  js  c++  java
  • 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相差比较大的数就好了。

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

  • 相关阅读:
    免费获取pptv会员
    LNMP环境包安装IonCube教程
    linux系统lnmp环境包搬家教程
    进入网站自动加自己为QQ好友代码
    vip视频解析接口
    CF使用TGP下载后,分卷文件损坏的解决方法
    体育赛事
    浅谈thinkphp中将字符串转换成json数组的方法
    android ANR问题
    android 单例模式
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3285775.html
Copyright © 2011-2022 走看看