SICP 习题 (1.37)解题总结
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)解题总结的更多相关文章
- SICP 习题 (1.13) 解题总结
SICP习题1.13要求证明Fib(n)是最接近φn/√5 的整数,其中φ=(1+√5)/2 .题目还有一个提示,提示解题者利用归纳法和斐波那契数的定义证明Fib(n)=(φn - ψn) / √5 ...
- SICP 习题 (1.7) 解题总结
SICP 习题 1.7 是对正文1.1.7节中的牛顿法求平方根的改进,改进部分是good-enough?过程. 原来的good-enough?是判断x和guess平方的差值是否小于0.001,这个过程 ...
- SICP 习题 (1.14)解题总结
SICP 习题 1.14要求计算出过程count-change的增长阶.count-change是书中1.2.2节讲解的用于计算零钱找换方案的过程. 要解答习题1.14,首先你需要理解count-ch ...
- SICP 习题 (1.8) 解题总结
SICP 习题1.8需要我们做的是按照牛顿法求平方根的方法做一个求立方根的过程. 所以说书中讲牛顿法求平方根的内容还是要好好理解,不然后面这几道题做起来就比较困难. 反过来,如果理解了牛顿法求平方根的 ...
- SICP 习题 (1.9) 解题总结
SICP 习题 1.9 开始针对“迭代计算过程”和“递归计算过程”,有关迭代计算过程和递归计算过程的内容在书中的1.2.1节有详细讨论,要完成习题1.9,必须完全吃透1.2.1节的内容,不然的话,即使 ...
- SICP 习题 (1.10)解题总结
SICP 习题 1.10 讲的是一个叫“Akermann函数”的东西,去百度查可以查到对应的中文翻译,叫“阿克曼函数”. 就像前面的解题总结中提到的,我是一个数学恐惧者,看着稍微复杂一点的什么函数我就 ...
- SICP 习题 (1.38)解题总结
SICP 习题1.38 紧跟着习题1.37的方向,要求我们用习题1.37中定义的cont-frac过程计算数学家欧拉大师在论文De Fractionibus Continuis 中提到的e-2的连分式 ...
- SICP 习题 (1.41)解题总结
SICP 习题1.41 看似和周边的题目没有关系,突然叫我们去定义一个叫double的过程,事实上这道题的核心还是高阶函数. 题目要求我们定义一个过程double,它以一个过程作为參数,这个作为參数的 ...
- SICP 习题 (1.39)解题总结
SICP 习题1.39沿着习题1.37, 1.38的方向继续前行,要求我们依据德国数学家J.H.Lambert的公式定义tan-cf过程,用于计算正切函数的近似值. J.H.Lambert的公式例如以 ...
随机推荐
- 标准I/O缓冲:全缓冲、行缓冲、无缓冲
说明:我仅仅对网络资源进行了整合,方便学习-.- 基于流的操作终于会调用read或者write函数进行I/O操作.为了使程序的执行效率最高,流对象一般会提供缓冲区,以降低调用系统I/O库函数的次数. ...
- 英特尔® 硬件加速执行管理器安装指南 — Microsoft Windows*
介绍 本文将指导您安装英特尔® 硬件加速执行管理器(英特尔® HAXM),这是一款可以使用英特尔® 虚拟化技术(VT)加快 Android* 开发速度的硬件辅助虚拟化引擎(管理程序). 前提条件 英特 ...
- Java OCR tesseract 图像智能字符识别技术 Java代码实现
接着上一篇OCR所说的,上一篇给大家介绍了tesseract 在命令行的简单用法,当然了要继承到我们的程序中,还是需要代码实现的,下面给大家分享下java实现的例子. 拿代码扫描上面的图片,然后输出结 ...
- 怎么样cocos2d-x正在使用ECS(实体-包裹-制)建筑方法来开发一款游戏?
简介 在我的博客,我翻译的几篇文章ECS文章.这些文章都是从Game Development站点.假设你对这个架构方式还不是非常了解的话.欢迎阅读理解 组件-实体-系统和实现 组件-实体-系统. 我发 ...
- Linux常见命令整理(一)
整理一下,以备后用 cd /home 进入/home文件夹 cd .. 返回上一级文件夹 cd ../.. 返回上两级文件夹 cd 进入个人的主文件夹 cd - 返回上次所在的文件夹 pwd 显 ...
- [LeetCode141]Linked List Cycle
题目:Given a linked list, determine if it has a cycle in it. 判断一个链表是否有环 代码: /** * Definition for singl ...
- 使用Simple DNS plus 构建自己的DNS
1.下载并安装Simple DNS plus 2.界面例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2tfYm9zcw==/font/5a6L ...
- 【YouVersion】 The Bible 圣经App
[YouVersion] The Bible 圣经 App 今天向大家郑重推荐一款非常棒的圣经App : <The Bible> YouVersion 团队开发的全球下载量和安装数目第 ...
- NVIDIA+关联2015写学校招收评论(嵌入式方向,上海)
我没有写很长一段时间Blog中的一个,在过去的几个月中还没有看到太多的生长技术,来来回回一直在做的事情,要毕业找工作,但发现并没有冷静下来,准备过.这不是让人觉得暂时补习班是凡人啊. 本科不试试.那你 ...
- 谈论json - json经常使用的功能
json经常使用的功能有JSON.parse().JSON.stringify(),供json对象和字符串之间的相互转换. 1.JSON.parse() 将 JavaScript 对象符号 (JSON ...