SICP 习题 1.35要求我们证明黄金切割率φ 是变换函数 x => 1+ 1/x 的不动点,然后利用这一事实通过过程fixed-point 计算出φ的值。

首先是有关函数的不动点,这个概念须要理解清晰,后面好几道题都是环绕函数不动点展开的。作者在这里设计这些习题的原因也是希望读者能够关注函数不动点。

事实上有关不动点这个东西我在做习题“1.8”的时候就认为好奇了。为什么“(x+x/y)/2”会不断逼近x的平方根呢?又为什么“(x/y2+2y)/3”会不断逼近x的立方根呢?

当时仅仅顾着做题,就沒有深入去考虑,经过1.35開始的几道题才開始对函数的不动点有了一些理解,反过来就认为习题“1.8”里提到的逼近x的立方根的方法比較easy理解了。

要完成这里的几道习题,大家首先须要读完书中的1.3.3这一节,里面有函数不动点的描写叙述。事实上,1.3.3节中的内容是想说明过程(或者说函数)能够被看作一般性的方法,对过程的通性进行讨论。仅仅是,作者可能认为用函数不动点这个例子能够非常好地展示过程的通性,所以使用了函数不动点作为例子。对于函数的不动点,我们能够无论过程的内在实现,而在过程外部通过一个一般性的方法求得这些过程的不动点。当然,不是全部函数都有不动点,所以这种方法并非对全部函数生效的。

那么,更进一步须要了解的就是:什么是函数的不动点?

书中是这样描写叙述的:

假设有x满足f(x)=x,那么x就称之为函数f()的不动点。

听起来有点抽象,不太好理解,假设我们用以下的例子可能就比較easy理解了。

我们假设眼下流行的韩国整容技术是一个函数,叫“整容()”,那么我们非常easy理解以下的等式:

整容(丑女)= 美女

就是一个丑女送进手术室,通过“整容”函数的处理,输出的是一个美女。

可是,事实上的整容沒有那么easy,须要一点一点去整,所以我们的函数应该像以下这样:

整容(丑女)= 美一点的丑女

假设我们把“美一点的丑女”送去整容,会有:

整容(美一点的丑女)= 更美一点的丑女

于是乎,假设我们有函数:

整容(整容(整容 ......(整容(整容(整容(整容(丑女)))))))

那么结果就应该非常接近美女了。

最终,假设我们把美女送去整容,出来的还是美女,就是说

整容(美女)= 美女

这个时候就是f(x)=x的时候了,就是说“美女”就是函数“整容”的不动点!

这样你应该能够理解什么是函数的不动点了吧?

理解了函数的不动点,我们再来看看怎样求出一个函数的不动点。还是用整容的例子,方法比較简单粗暴,就是把随便一个人送去整容,进去之前和送出来后都拍个照片,假设两张照片相差比較大,就说明这个人整容的空间还比較大,弄进去再整,直到进去之前和出来之后看不出什么区别了,那么这个结果就是“整容”函数的不动点了!

假设说“全智贤”是韩国整容界公认的典型美女的话,你随便抓一个人,无论性别,送去给韩国整容医生不断整容,最后出来的都长成“全智贤”那样。

我们就得出了“韩国整容”函数的不动点,那就是“全智贤”!

进一步考察的话,你会发现这个寻找函数不动点的方法和函数本身没太大关系,“整容”的函数能够用这种方法,“健身”的函数也一样,“server调优”的函数也一样,基本思路就是不断反复调用这个函数,直到这个函数对目标不再起作用为止。

这样就能够理解书中的fixed-point函数了:

(define tolerance 0.00001)

(define (fixed-point f first-guess)
(define (close-enough? v1 v2)
(< (abs (- v1 v2 )) tolerance))
(define (try guess)
(let (( next (f guess)))
(if (close-enough? guess next)
next
(try next))))
(try first-guess))

fixed-point函数的作用就是用first-guess作为初始材料,不断调用函数f对它进行加工,直到f函数的输入值和输出值close-enough为止。

这时候回过来考察1.1.7章的求平方根的函数就有清晰的思路了。

书中提到,假设我们希望求一个数x的平方根,就是要求一个y,使得y^2 = x,由y^2=x推导出一个等式y=x/y,所以我们要求的是变换x => x/y的不动点。

这种描写叙述方式对数学高手们是如此简单,仅仅是对于我等数学白痴来讲还是不好理解。

我对于求平方根的方法的理解过程是这种。

首先我们把问题简化一下,求x的平方根变为求一个已知数的平方根,比方求10的平方根。

这种话我们要求的事实上是一个x,使x * x =10。

或者说是求x1 * x2= 10,同一时候x1= x2。

假设要让x1 * x2=10的条件满足,那么就有x1 = 10 / x2,这个简单的数学转换就好理解了吧。

接着,假设我们设计一个函数f(x)是这种 f(x) = 10/x,上面的等式就能够写成以下这样:

x1 = 10 / x2 = f (x2)

也就是 x1 = f (x2)

假设我们找到了函数f(x)的不动点,就有f(x)= x,就是有:

x1=f(x2) = x2

这时候就是x1=x2的时候了。

恭喜一下你自己吧!你找到求10得平方根的方法了!

仅仅是。。。。。可惜的是,就像书中说的,变换x => 10/ x并不收敛!

简单说就是函数f(x)= 10/x沒有不动点!

假设上面这些x1,x2不正确你胃口,你还是不理解的话,想象一下以下的场景:

假设你是一个整容医生,须要对人的眼睛进行整容,而高手告诉你的秘诀是两个眼睛长度的乘积等于10的时候就是最漂亮的一双眼睛,你会怎么做呢?

首先你有个常识,就是左右眼要一样大才行,不然整成大小眼了。当今你要做的就是按高手的秘籍整,直到两个眼睛一样大为止。

好,我们这些笨整容医师们,開始手术啦!

有个人来了,量量他的左眼,嘻嘻,左眼长度2CM!啊,多么小的眼睛呀。

那么,按秘籍算一算右眼应该是多大呢?10/2=5!右眼5CM就好了!

手术过后看看完了!大小眼!左眼2CM,右眼5CM。

这不行,把左眼搞成跟右眼一样吧,也是5CM!

再按秘籍算一算右眼应该是多长?左眼5CM,10/5=2,右眼2CM就好了!

手术过后再看!还是大小眼!左眼5CM,右眼2CM。

继续整!

哈!没完没了了!人给你整残了你也做不完!

这就叫一个不收敛的变换!

咋办哩?

用书上说到的“平均阻尼”术!

假设你发现一个人左眼2CM,右眼5CM,合理的眼睛长度应该是两个眼睛长度的平均数吧!

应该是(2+5)/2,那就是3.4CM

假设左眼搞成3.4CM长,按秘籍计算的话,右眼应该是10/3.4=2.94左右。

左眼3.4CM,右眼2.94CM,还是大小眼,继续平均一下,眼睛长度应该是(3.4+2.94)/2 吧,大概是3.17.

这就对了嘛,越来越接近了。

所以 x => (x + x/10)/2 这个变化是收敛的。

我们最终能够整出一对漂亮的双眼了! (上帝呀,千万不要让技术男去做整容医师呀。)

回到题目的本身,题目是要求我们证明黄金切割率 φ 是变换函数 x => 1+ 1/x 的不动点。

黄金切割率φ是什么?翻回书上的1.2.2节先看看:

φ=1.6180

他是怎么求出来的呢,他是按等式φ^2=φ+1求出来的。

也就是说,假设有x^2=x+1,那么x就是黄金切割率。

各位看官请注意,这是SICP书上说的,你要是去百度查黄金切割率可不是这么回事,百度告诉我们黄精切割率是0.618!

于是有人还去百度问,究竟黄金切割率是1.618还是0.618?

事实上两个都对,所谓黄金切割,就是把一个线段AB分成两段,各自是AO和OB,假设AB/AO=AO/OB,那么这个线段AB就被“黄金切割”了,这时候假设我们把黄金切割率记录成AB/AO就是1.618,反过来假设我们记录成AO/AB就是0.618,这也是黄金切割率迷人的地方,由于1/1.618=0.618。

好,方便起见,我们就用x^2=x+1这个表达式吧,我们要证明函数1+1/x的不动点x满足x^2=x+1。

有了上面的一系列分析,你会发现问题不是太难。

我们有一个函数f(x)=1+1/x,还是用x1和x2两个数,x1表示函数输出,x2表示函数输入,就有:

x1=1+1/x2

当我们找到函数f(x)=1+1/x的不动点的时候,意味着f(x)=x,就是说x1=x2。

上面的等式就变为x1=1+1/x1,这时候两边都乘以x1,就有x1^2=x1+1。

哈哈,就是说函数f(x)=1+1/x的不动点x满足方程x^2=x+1,满足方程x^2=x+1的就是φ!

题目的后半部分还要求我们依据这个事实使用fixed-point函数求φ,这就简单了

(fixed-point (lambda (x) (+ 1 (/ 1 x))) 1)

SICP 习题 (1.35)解题总结的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

  7. SICP 习题 (1.41)解题总结

    SICP 习题1.41 看似和周边的题目没有关系,突然叫我们去定义一个叫double的过程,事实上这道题的核心还是高阶函数. 题目要求我们定义一个过程double,它以一个过程作为參数,这个作为參数的 ...

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

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

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

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

随机推荐

  1. sql_date

    往Oracle数据库中插入日期型数据(to_date的用法) INSERT  INTO  FLOOR  VALUES  ( to_date ( '2007-12-20 18:31:34' , 'YYY ...

  2. http常见状态码有哪些?

    ajax常见面试题 1:什么是ajax?ajax作用是什么? 异步的javascript和xml AJAX 是一种用于创建快速动态网页的技术. ajax用来与后台交互 2:原生js ajax请求有几个 ...

  3. android:项目迁移error:Please change caller according to com.intellij.....

    迁移到Android Studio中的项目,在运行时有时会在Event Log中报这种错: Please change caller according to com.intellij.openapi ...

  4. 直到黎明 Until Dawn 后感

    直到黎明 会免游戏.白金神作.近些年的恐怖电影都有游戏化的趋势,韩国的某岩vlog,美国的真心话大冒险,都把观众作为meta代入游戏,几乎模糊了游戏与游戏的边界,直到黎明这部电影,与当年的暴雨和超凡双 ...

  5. 【转】SSL协议详解

    作者:朱祁林 出处:http://zhuqil.cnblogs.com 原文链接 背景介绍    最近在看<密码学与网络安全>相关的书籍,这篇文章主要详细介绍一下著名的网络安全协议SSL. ...

  6. geogebra几何画图工具用法

    1. intersectPath :该命令可以自动“算出”对应多边形的交汇区域 2. 静态文本可以指定到一个对象的中间这样将来动态变化对象大小时也不出现问题 3.export worksheet 4. ...

  7. Oracle 18c新特性一览

    1. 一般新特性 1.1. Shadow Lost Write Protection Shadow lost write protection检测到一个丢失的写,它会导致一个主要的数据损坏.可以在不需 ...

  8. vue的项目

    vue的项目打开也是非常具有解耦性的 最重要的就是src目录了  我们的入口在main中  main是你的实例化vue  app中就是我们的每一块田地是我们的vue实例对这个的操作 ,index因为是 ...

  9. 发现微信支付bug

    第一张银行卡支付金额不足无法付款,选择另一张同样密码的银行卡,居然不用重新输入密码即可直接付款成功!

  10. KInect AR沙盒制作的一点小经验

    最近在微博上看到这样一条 微博  >点这看< 看起来非常有意思,就去Google了一下如何制作. 没想到这是一个开源项目,而且还告诉你如何安装 OK,接下来就说说我的制作过程. 首先,先放 ...