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. CSS之浮动布局(float,浮动原理,清除/闭合浮动方法)

    css之浮动布局 本人博客:查看文章   1.什么是浮动:在我们布局的时用到的一种技术,能够方便我们进行布局,通过让元素浮动,我们可以使元素在水平上左右移动,再通过margin属性调整位置 2.浮动的 ...

  2. Spring Boot—05页面跳转

    package com.smartmap.sample.ch1.controller.view; import org.springframework.stereotype.Controller; i ...

  3. 封装一个 TopBarBaseActivity

    什么是快速开发嘞,看这个效果 然而我只用了这么几行代码: activity_main.xml 里面什么也没有! 其实说白了哈,就是我把 TopBar 封装在 TopBarBaseActivity 里面 ...

  4. 例如android:layout_marginBottom的值为负数

    为什么有时候像android:layout_marginBottom等变量的赋值为负数? 例如如下代码: <?xml version="1.0" encoding=" ...

  5. windows域渗透实战

    测试环境 域控: 192.168.211.130 已经控制的机器: 192.168.211.133 获取网络信息 查看机器的网络信息 ipconfig /all # 查看 网卡信息,获取dns 服务器 ...

  6. I/O复用及epoll基础知识

    IO multiplexing IO multiplexing这个词可能有点陌生,但是如果我说select,epoll,大概就都能明白了.有些地方也称这种IO方式为event driven IO.我们 ...

  7. Orcal数据库,使用EF的自增处理

    1.定义EF拦截器,截获执行命令前的操作.修改执行sql.还需要定义orcal序列,供自增使用 using System; using System.Collections.Generic; usin ...

  8. C#实现字符串计算

    借用DataTable的Compute函数进行计算. string formula = "1+1*4/3+23*(1+2)"; DataTable dt = new DataTab ...

  9. 使用NSOperation以及NSOperationQueue

    使用NSOperation以及NSOperationQueue NSOperation vs. Grand Central Dispatch (GCD) 在Mac OS X v10.6和iOS4之前, ...

  10. 关于RSA、公钥、私钥、加密、签名的那些概念

    前言 作为一名程序员,经常会听到加密解密之类的词.而非对称加密技术,应用的非常广泛.本文不写加密技术的原理,只是希望以一个简单的类比,让大家了解非对称加密中常见词的概念,以及它的作用. 介绍 在RSA ...