SICP题解----第1.1节练习

第1.1节的练习包括习题1.1到1.8

其中习题1.1--1.6在构造过程抽象的第一节已经给出。

下面给出练习1.7和练习1.8的题解。

练习1.7

首先观察课本上的程序的问题.

可以发现,对于特别小的数,比如 0.00009 ,书本给出的 sqrt 并不能计算出正确的答案; 而对于特别大的数,因为实现的小数精度不足以表示两个大数之间的差,所以 sqrt 会陷入死循环而无法得出结果。

要避免这一错误,我们按照练习所说,对 good-enough? 进行修改:不再检测猜测值 guess 的平方与 x 之间的差,而是检测新旧两次猜测值之间的比率,当比率变化非常小时,程序就停止 improve 。

新的 good-enough? 定义如下:

(define (good-enough? old-guess new-guess x) ; old-guess*newguess/x -1
    (< (abs (- (/ (* old-guess new-guess)x) 1))

结果如下:

练习1.8

只需简单修改牛顿法求平方根即可。

时间: 2024-12-07 21:53:49

SICP题解----第1.1节练习的相关文章

SICP题解

这里用Common Lisp.Haskell等语言. 1.2.请将下面表达式变换为前缀形式: $$ \frac{5 + 4 + (2 - (3 - (6 + \frac{4}{5})))}{3(6 - 2)(2 - 7)} $$ Lisp: (/ (+ 5 (+ 4 (- 2 (- 3 (+ 6 (/ 4 5)))))) (* 3 (* (- 6 2) (- 2 7))) ) Output: 或者: (/ (+ 5 4 (- 2 3 (- (+ 6 (/ 4 5))))) (* 3 (- 6 2

关于SICP 1.2.2节中的换零钱方式的统计研究及其迭代实现。

关于SICP 1.2.2节中的换零钱方式的统计研究及其迭代实现 最近开始看sicp(计算机程序的构造和解释)一书,此书竟然是mit的计算机入门教材,不得不令人感叹天朝大学教育与真正一流大学的差距之大..我们在学习c语言的时候,人家已经开始学习剥离具体语言之外的编程思想了..扯远了,说回正题 sicp在1.2.2节中提到了一个有意思的换零钱实例: 将1美元(100美分)换成半美元,1/4美元,10美分,5美分,1美分的零钱,一共有多少种换法? 初看感觉有点无从下手,脑子里想的是各种排列组合,一片混

【转】谈语法

谈语法 使用和研究过这么多程序语言之后,我觉得几乎不包含多余功能的语言,只有一个:Scheme.所以我觉得它是学习程序设计最好的入手点和进阶工具.当然 Scheme 也有少数的问题,而且缺少一些我想要的功能,但这些都瑕不掩瑜.在用了很多其它的语言之后,我觉得 Scheme 真的是非常优美的语言. 要想指出 Scheme 所有的优点,并且跟其它语言比较,恐怕要写一本书才讲的清楚.所以在这篇文章里,我只提其中一个最简单,却又几乎被所有人忽视的方面:语法. 其它的 Lisp "方言"也有跟

干货:图解算法——动态规划系列

小浩:宜信科技中心攻城狮一枚,热爱算法,热爱学习,不拘泥于枯燥编程代码,更喜欢用轻松方式把问题简单阐述,希望喜欢的小伙伴可以多多关注! 动态规划系列一:爬楼梯 1.1 概念讲解 讲解动态规划的资料很多,官方的定义是指把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解.概念中的各阶段之间的关系,其实指的就是状态转移方程.很多人觉得DP难(下文统称动态规划为DP),根本原因是因为DP区别于一些固定形式的算法(比如DFS.二分法.KMP),没有实际的步骤规定第一步第二步来做什么,所以准

江西司法厅厅长沙闻麟任宁夏高院副院长(图/简历)

淡淡稻花香看起来年纪并不大算是个清秀的少一张雪白的脸蛋带着一丝惊惧之色她看着我的样子小声道对不起那次我并不是故意想害你只是我身不由己 但是很快的他们达成了共识先把我清理出去然后在决出胜负对于这个伤害我并不满意刚才凌月还一下子轰掉点气血呢 但就在这时前面有了动静只见一个团队的玩家正在练级徽记很明显赫然是永恒的玩家似乎是一个千人团正在清理月光森林空地上的狼群 当然看了看场边这个人正在于很萌很好推聊天是兄弟会的人看起来脸上满是稚气嗯其实很挺帅一身的肌肉疙瘩吃完饭后回到房间就沉沉的睡了过去 陕炼退司夏狭

SICP学习笔记及题解---构造过程抽象(一)

有段时间没看这本书了. 而且在做笔记的时候产生了一些疑问,觉得这样照着书做笔记没什么意义.于是乎,改变了一下做法.改成先提出疑问,记下重点,然后结合实际案例学习相关东西,最后附上题解, ok,下面就是第一次的笔记.(依旧是旧套路的) 本节内容 l  讨论基本的Scheme语法规则 l  过程的定义 l  代换模型 l  条件表达式和谓词 l  过程抽象 l  与C语言比较 程序设计的基本元素 所有的高级的语言都会在把简单的认知组合起来形成复杂认识的方法上有独到之处.而且每个强有力的语言都为此提供

算法(第四版)Java 第一章1.2节 题解

前言 整本<算法>Java版的题解已经托管在Github上:https://github.com/Mereder/Algorithms_4th ,大家根据README.md的导航可以迅速定位章节. 书中代码用到了很多<算法>官方提供的依赖:https://algs4.cs.princeton.edu/home/  大家可以去官网多逛逛,图书章节配合官网内容一起看效果很好. 欢迎大家站内私聊交流!小白一枚,还请前辈们多多指教! 本部分内容全部以代码形式展示,编译器为IDEA 2018

SICP学习笔记及题解—构造过程抽象(三)

主要内容 高阶过程:以过程为参数和/或返回值的过程 lambda 表达式 let 表达式 用过程作为解决问题的通用方法 求函数的 0 点 求函数的不动点 返回过程值 过程是语言里的一等公民 (first-class object) 1.3.1高阶过程 过程是抽象,一个过程描述了一种对数据的复合操作,如求立方过程:(define (cube x) (* x x x)) 换个方式,也可以总直接写组合式:(* 3 3 3), (* x x x), 不定义过程,总基于系统操作描述,不能提高描述的层次,

SICP学习笔记及题解---构造过程抽象(二)

主要内容: 表达式,值,define 过程的内部定义和块结构(上述示例已经解释) 分析过程(静态,描述)产生的计算进程(动态,行为) 计算进程的类型 线性递归 线性迭代 树形递归 计算的代价 第一部分: 表达式,值,define 1.总结表达式的一些概念 变量 如果一个变量没定义,对它求值是错误,求值中断,如果变量有定义,求值得到它当时的关联值 内部过程 对内部过程名求值得到某种特殊信息.如(不同系统可能不同) 组合过程: 对自己定义的过程名求值也得到特殊信息. 特殊形式的名字不能求值 例如,对