SICP 习题 2.11又出现Ben这个人了,如曾经说到的,仅仅要是Ben说的一般都是对的。

来看看Ben说什么。他说:“通过监測区间的端点,有可能将mul-interval分解为9中情况,每种情况中所须要的乘法都不超过两次”。

所以这个叫Ben的人建议Allysa重写mul-interval过程。

究竟是啥意思呢。我们先来看看曾经的mul-interval过程:

(define (mul-interval x y)
(let (( p1 (* (lower-bound x) (lower-bound y)))
( p2 (* (lower-bound x) (upper-bound y)))
( p3 (* (upper-bound x) (lower-bound y)))
( p4 (* (upper-bound x) (upper-bound y))))
(make-interval (min p1 p2 p3 p4)
(max p1 p2 p3 p4))))

能够发现,这里使用了4次乘法。然后取4此乘法的最小值为起点,最大值为终点。

按Ben的意思,我们能够将这4次乘法降低为两次,前提是对区间的端点进行推断。

事实上我们自己想一想大概能够明确Ben这段神奇的话。 比方,假设相乘的两个区间都是全然大于零的区间。两个区间的起点相乘肯定是4次乘法中最小的值,而两个终点相乘肯定是4次乘法中的最大的,这样我们仅仅须要计算两个起点相乘,还有就是两个终点相乘就能够了。

这样我们就能够使用2次乘法完毕工作,而不用4次。

只是,对我们程序猿来讲工作就复杂非常多了,我们须要取推断这9中情况,分别想好9种情况种选用什么作为结构的起点和终点。最后写出来的代码例如以下,巨烦琐:

(define (mul-interval x y)
(if (> (lower-bound x) 0)
(if (> (lower-bound y) 0)
(make-interval (* (lower-bound x) (lower-bound y)) (* (upper-bound x) (upper-bound y)))
(if (> (upper-bound y) 0)
(make-interval (* (upper-bound x) (lower-bound y)) (* (upper-bound x) (upper-bound y)))
(make-interval (* (lower-bound x) (upper-bound y)) (* (lower-bound x) (upper-bound y)))))
(if (> (upper-bound x) 0)
(if (> (lower-bound y) 0)
(make-interval (* (lower-bound x) (upper-bound y)) (* (upper-bound x) (upper-bound y)))
(if (> (upper-bound y) 0)
(make-interval (* (lower-bound x) (lower-bound y))
(* (upper-bound x) (upper-bound y)))
(make-interval (* (lower-bound x) (lower-bound y))
(* (upper-bound x) (upper-bound y)))))
(if (> (lower-bound y) 0)
(make-interval (* (lower-bound x) (lower-bound y)) (* (upper-bound x) (upper-bound y)))
(if (> (upper-bound y) 0)
(make-interval (* (lower-bound x) (lower-bound y))
(* (upper-bound x) (upper-bound y)))
(make-interval (* (lower-bound x) (lower-bound y))
(* (upper-bound x) (upper-bound y))))) )))

有人可能会问。把原来那个如此优雅的过程写成如今这样有意思吗?一堆丑陋的推断。

这里须要理解的就是。假设系统中乘法是一个消耗非常大的操作。比方每一个乘法消耗2秒,这样我们做这个优化就有意义的,尽管我们写的代码丑非常多,麻烦非常多,只是代码执行效率就比較高了。

SICP 习题 (2.11)解题总结:区间乘法的优化的更多相关文章

  1. SICP 习题 (1.14)解题总结

    SICP 习题 1.14要求计算出过程count-change的增长阶.count-change是书中1.2.2节讲解的用于计算零钱找换方案的过程. 要解答习题1.14,首先你需要理解count-ch ...

  2. SICP 习题 (1.13) 解题总结

    SICP习题1.13要求证明Fib(n)是最接近φn/√5 的整数,其中φ=(1+√5)/2 .题目还有一个提示,提示解题者利用归纳法和斐波那契数的定义证明Fib(n)=(φn - ψn) / √5 ...

  3. SICP 习题 (1.7) 解题总结

    SICP 习题 1.7 是对正文1.1.7节中的牛顿法求平方根的改进,改进部分是good-enough?过程. 原来的good-enough?是判断x和guess平方的差值是否小于0.001,这个过程 ...

  4. SICP 习题 (1.8) 解题总结

    SICP 习题1.8需要我们做的是按照牛顿法求平方根的方法做一个求立方根的过程. 所以说书中讲牛顿法求平方根的内容还是要好好理解,不然后面这几道题做起来就比较困难. 反过来,如果理解了牛顿法求平方根的 ...

  5. SICP 习题 (1.9) 解题总结

    SICP 习题 1.9 开始针对“迭代计算过程”和“递归计算过程”,有关迭代计算过程和递归计算过程的内容在书中的1.2.1节有详细讨论,要完成习题1.9,必须完全吃透1.2.1节的内容,不然的话,即使 ...

  6. SICP 习题 (2.10)解题总结: 区间除法中除于零的问题

    SICP 习题 2.10 要求我们处理区间除法运算中除于零的问题. 题中讲到一个专业程序猿Ben Bitdiddle看了Alyssa的工作后提出了除于零的问题,大家留意一下这个叫Ben的人,后面会不断 ...

  7. SICP 习题 (2.8) 解题总结:区间的减法

    SICP 习题 2.8 须要我们完毕区间运算的减法.区间运算的加法书中已经有了,代码例如以下: (define (add-interval x y) (make-interval (+ (lower- ...

  8. SICP 习题 (1.10)解题总结

    SICP 习题 1.10 讲的是一个叫“Akermann函数”的东西,去百度查可以查到对应的中文翻译,叫“阿克曼函数”. 就像前面的解题总结中提到的,我是一个数学恐惧者,看着稍微复杂一点的什么函数我就 ...

  9. SICP 习题 (2.7) 解题总结 : 定义区间数据结构

    SICP 习题 2.7 開始属于扩展练习,能够考虑不做,对后面的学习没什么影响.只是,假设上面的使用过程表示序对,还有丘奇计数你都能够理解的话,完毕这些扩展练习事实上没什么问题. 习题2.7是要求我们 ...

随机推荐

  1. checkbox控制显示隐藏

    显示文本框<input type = "checkbox" id="checkbox" onclick="on_hide();"/&g ...

  2. 使用了未经检查或不安全的操作。有关详细信息, 请使用 -Xlint:unchecked 重新编译。

    警告信息如下:

  3. Hadoop不同模式下关键配置属性

    Hadoop分为三种模式: 独立(或本地)模式. 伪分布模式. 全分布模式 不同模式下关键配置项及属性内容如下面表格所示 组件名称 配置的文件名 属性名称 独立模式 伪分布模式 全分布模式 Commo ...

  4. The Zen of Python, by Tim Peters

    Beautiful is better than ugly. Explicit is better than implicit. Simple is better than complex. Comp ...

  5. Adobe AIR and Flex - 保存序列化对象文件(译)

    创建任何桌面应用程序几乎总是需要在本地存储数据,通过Adobe AIR我们有几下面几个选择,一个是我们能够使用内置的 SQLite 数据库支持,对于少量的数据这是大材小用了.另外一个选择是我们通过把数 ...

  6. 【Hibernate学习】 —— 抓取策略(注解方式)

    当应用程序须要在关联关系间进行导航的时候.hibernate怎样获取关联对象的策略. 抓取策略的方式: FetchType.LAZY:懒载入.载入一个实体时.定义懒载入的属性不会立即从数据库中载入. ...

  7. Android笔记——Activity中的数据传递案例(用户注冊)

    1.创建程序activity_main: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/andro ...

  8. 编译并使用boost库(win7+boost1.63+vs2015+32位or 64位),超详细,boost于vs2017下编译(64/32bit)

    首先下载得到boost的最新版(目前最新版是1.63) 下载地址: http://www.boost.org   也可以从这里直接下载 http://download.csdn.net/detail/ ...

  9. hdoj--2709--Sumsets(数位dp)

    Sumsets Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  10. Deleting elements

    There are several ways to delete elements from a list. If you know the index of the element you want ...