• 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相差比较大的数就好了。

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

  • 相关阅读:
    C# Enum转换
    Split
    WCF访问安全
    [转] 检索 COM 类工厂中 CLSID 为 {000209FF00000000C000000000000046} 的组件时失败
    ICSharpCode.SharpZipLib.dll压缩的zip包,7zip解压时出错
    js控制ctrl+p
    跨域访问WCF问题
    sql:过滤字段中是否包含数字
    序列化/反序化
    [转]RegistryKey 操作注册表
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3285775.html
Copyright © 2020-2023  润新知