SICP 习题 1.37是一条非常长的题目,主要讲的是无穷连分式。无穷连分式对我来说又是一个陌生的概念,于是又去百度了一番,发现无穷连分式也是一个非常有意思的话题,涉及到无理数的表达。只是我建议大家还是临时不要深入思考它的数学含义,一旦開始思考可能你又会跳进数学的深渊中不可自拔。

无穷连分式的形式例如以下:

就像书中说到的,作为无穷连分式的一个特殊样例,假设N和D都为1的话,f= 1/ φ, 这点能够结合我们之前对黄金切割率的计算证明,这里就不多说了,并且,假设你不能从数学上理解它也无所谓,不影响我们做题目,我们越来越强大了,强大到能够忽略题干中得数学定义直接完毕习题。

题目进一步讨论无穷连分式的计算,由于无穷连分式是无穷的,所以我们无法直接计算它的结果。为了计算一个无穷连分式的大概结果,简单的办法就是计算前面K个项,就像以下这样:

这样我们就能够通过K 次计算完毕某个无穷连分式的计算,当然,计算的结果是一个约数,不是准确数字。

题目要求我们完毕一个名为cont-frac的过程,这个过程接受3个參数,各自是n, d 和k,当中n表示无穷连分式的N部分,d表示无穷连分式的D部分,k代表取几个项进行计算。

假设我们细致看无穷连分式的定义,就会发现这是一个非常典型的递归定义。对于我们定义的cont-frac的过程,基本上它要做的事情就是:(cont-frac n) = N(n) / (D(n) + contact-frac(n+1))

除了上面的递归调用以外,cont-frac中还要完毕的就是对k的比較,确定什么时候结束递归调用,開始返回。

我定义的递归计算步骤例如以下:

(define (cont-frac n d k)
(define (cont-frac-inner n d cur-k)
(if (< cur-k k)
(/ (n cur-k) (+ (d cur-k) (cont-frac-inner n d (+ cur-k 1))))
(d cur-k)))
(cont-frac-inner n d 1))

反过来,实现的迭代计算步骤例如以下:

(define (cont-frac-iter n d k)
(define (cont-frac-iter-inner n d cur-k cur-value)
(if (= cur-k k)
(cont-frac-iter-inner n d (- cur-k 1) (d cur-k))
(if (> cur-k 1)
(cont-frac-iter-inner n d (- cur-k 1) (+ (d cur-k) (/ (n cur-k) cur-value)))
(/ (n cur-k) cur-value)))) (cont-frac-iter-inner n d k 0))

接着,题目还要求我们用这个cont-frac来计算黄金切割率,这个比較简单,直接给n和d传递一个返回1的lambda过程就好了,我的測试方法例如以下:

(define (Phi-test k)
(cont-frac (lambda (i) 1.0)
(lambda (i) 1.0)
k)) (define (Phi-test-iter k)
(cont-frac-iter (lambda (i) 1.0)
(lambda (i) 1.0)
k))

最后,题目中还要求我们确定k取值多少的时候能够计算出有4位精度的黄金切割率,这就非常easy了,多測试几个cont-frac的调用就好了。

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

  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.38)解题总结

    SICP 习题1.38 紧跟着习题1.37的方向,要求我们用习题1.37中定义的cont-frac过程计算数学家欧拉大师在论文De Fractionibus Continuis 中提到的e-2的连分式 ...

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

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

  9. SICP 习题 (1.39)解题总结

    SICP 习题1.39沿着习题1.37, 1.38的方向继续前行,要求我们依据德国数学家J.H.Lambert的公式定义tan-cf过程,用于计算正切函数的近似值. J.H.Lambert的公式例如以 ...

随机推荐

  1. mysqldump: Couldn't execute 'show events': Cannot proceed because system tables used by Event Schedu

    最近将老版本的mysql 实例倒入 percona 5.5.30,使用的是线上的全备,结果将mysql 库下的表也倒入了,这下可悲剧了,备份报错. 没办法,将mysql库下的数据倒出来,清空,再倒入p ...

  2. win7,win8取得管理员权限 .reg文件

    Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\*\shell\runas] @="获取管理员所有权" " ...

  3. Android动画之二:View Animation

    作为一个博客<Android其中的动画:Drawable Animation>.android动画主要分为三大部分.上一篇博客已经解说Drawable Animation的使用方法,即逐帧 ...

  4. Mono for Android开发调研笔记

    安装完Mono for Android(简称:MonoDroid)之后,可以用MonoDevelop或Visual Studio来开发Mono for Android应用程序:目前只能在模拟器上调试和 ...

  5. Linux下一个OTL 采用long long类型数据库支持BIGINT

    码如下面: #define OTL_BIGINT long long #define OTL_STR_TO_BIGINT(str,n) \ { \ n=atoll(str); \ } #define ...

  6. lua.c:80:31: fatal error: readline/readline.h: No such file or directory

    make linuxcd src && make linuxmake[1]: Entering directory `/root/lua/lua-5.3.2/src'make all ...

  7. Objective-C路成魔【11-多态性、动态类型和动态绑定】

    郝萌主倾心贡献.尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠.支持郝萌主.捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 多态这个其 ...

  8. ZendStudio10.6.1如何安装最新的集成svn小工具?

    选择Help菜单->Install New Software...在Work with输入http://subclipse.tigris.org/update_1.10.x,等待完成后,.除了S ...

  9. 单元测试React

    React单元测试——十八般兵器齐上阵,环境构建篇 一个完整.优秀的项目往往离不开单元测试的环节,就 github 上的主流前端项目而言,基本都有相应的单元测试模块. 就 React 的项目来说,一套 ...

  10. Unity3d 实时折射和反射

    这里只是张贴在实时折射和脚本反思shader, 大约NGUI第一部分请下载. 这个版本的主要缺点是折射平面部Layer必须是water层.假设有专家谁可以摆脱这一个.请记得把代码回该条,谢谢! Wat ...