SICP 习题(1.1,1.2,1.3,1.4)解题总结。
近来在重读SICP,以前读过一次,读了第一二章就没有坚持下去,时间一长就基本忘记了,脑海里什么都不剩,就隐约记得自己曾经读过一本很牛B的书。
这次读希望能够扎实一点,不管能读到哪里,希望可以理解一些东西,以后可以在日常工作中用到,所以开始一道一道地做题,强迫自己深入学习。
后来发现效果不错,于是产生了写解题总结的想法,可以和大家分享,同时加深自己的印象。因为是工作之余才有时间写总结,所以也不能确定更新时间,能写多少是多少吧。
前面几道题比较简答,所以就将1.1,1.2,1.3,1.4这四道题合在一起写了。
1.1的题目是写出一系列表达式的输出结果。
题中列出的表达式里主要是+,-,*,/四则运算,cond和if的使用,还有define的使用。具体表达式就不列出来了,解这道题建议分两步,第一步是拿纸笔做,目的是深入了解Scheme的基本语法,第二步是搭建mit-scheme环境逐步去验证自己第一步做的答案,目的是搭建mit-scheme环境,熟悉mit-scheme环境的使用。如果发现对不上的话就同时检查两边的结果,看是自己用纸笔算错了还是代码写错了,记住,不一定计算机算出来就是对的,我自己就有纸笔算对了,然后通过计算机运行时因为输入错误导致代码出错的。
1.2 是将一个表达式转换成前缀表达式。
这道题认真一点慢慢做的话没什么难度,属于RPG游戏里刚开始那种引导性的角色,按步就班一招一式下来就完成任务了。主要目的是熟悉前缀表达式。
同样,建议手算一遍,在mit-scheme环境里跑一遍,然后对对结果。
1.3 的原题是这样的:请定义一个过程,它以三个数为参数,返回其中较大的两个数的和。
我刚开始做这道题的时候,怀着对SICP的无比崇敬,总觉得会有一个特别聪明的方法,左思右想不敢开始写代码。
后来终于屈服于“自己不是天才”的想法,老老实实写了下面的代码:
(define (sum-larger-two x y z)
(cond ((and (< x y) (< x z)) (+ y z))
(else (cond ((< y z) (+ x z))
(else (+ x y))))))
简单测试通过,后来就去网上找答案,发现原来大家的解法都差不多,都是几个判断组合起来。有趣的是网上的答案五花八门,各种条件的组合都有,有兴趣的同学们可以去找找看。
回过头来看这道题的话,主要就是看你对cond或者是if的使用了,能够正确地写完cond或者是if的完整结构就能解这道题了。
1.4 的题目如下:
请仔细考察上面给出的允许运算符为复合表达式的组合式的求值模型,根据对这一模型的认识描述下面过程的行为:
(define (a-plus-abs-b a b)
((if (> b 0) + -) a b))
题目本身有点绕,什么“允许运算符为复合表达式的组合式的求值模型”,看一轮下了不知道题目说的啥。其实就是说+ 和-这样的运算符可以当作返回值,返回以后就真的当运行符使用。
就像上面的代码,如果b>0就返回+,否则就返回-,同时,返回的+或者-就直接作为a和b的运算符,理解了这一点上面的代码就很清晰了。
做到这里已经感觉到SICP的强大气场了,大家手上用的编程语言没几个可以将运算符当返回值用的吧,而且返回后真的就当运算符用!
同样的,在Scheme里,或者说在Lisp里,运算符是可以当参数传到过程里的。
就这个后来还有人演绎成一个故事叫《四个程序员的一天》,引起无数程序员的惊叹,同时也引起无数程序员的不满。
如果你曾经为《四个程序员的一天》感叹过,那么,请注意,该故事中强大的Lisp程序员使用的那招不过是SICP中第一章起步的一个小练习而已。
就像是《大雨商家堡》中阎基打败大镖头马行空的那几招不过是《胡家刀法》中前面两页的入门招数而已。
SICP 习题(1.1,1.2,1.3,1.4)解题总结。的更多相关文章
- 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.13) 解题总结
SICP习题1.13要求证明Fib(n)是最接近φn/√5 的整数,其中φ=(1+√5)/2 .题目还有一个提示,提示解题者利用归纳法和斐波那契数的定义证明Fib(n)=(φn - ψn) / √5 ...
- SICP 习题 (2.7) 解题总结 : 定义区间数据结构
SICP 习题 2.7 開始属于扩展练习,能够考虑不做,对后面的学习没什么影响.只是,假设上面的使用过程表示序对,还有丘奇计数你都能够理解的话,完毕这些扩展练习事实上没什么问题. 习题2.7是要求我们 ...
- SICP 习题 (2.6) 解题总结:丘奇计数
SICP 习题 2.6 讲的是丘奇计数,是习题2.4 和 2.5的延续. 这里大师们想提醒我们思考的是"数"究竟是什么,在计算机系统里能够怎样实现"数".准备好 ...
- SICP 习题 (1.37)解题总结
SICP 习题 1.37是一条非常长的题目,主要讲的是无穷连分式.无穷连分式对我来说又是一个陌生的概念,于是又去百度了一番,发现无穷连分式也是一个非常有意思的话题,涉及到无理数的表达.只是我建议大家还 ...
- SICP 习题 (1.43)解题总结
SICP 习题 1.43 是前面两道题的延续,习题要求我们定义一个过程(repeat f n) .当中f是一个单參数过程.题目要求我们通过repeat过程将过程f调用n次,注意是嵌套调用n次,不是连续 ...
随机推荐
- testing and SQA_动态白盒測试
一.软件測试技术: 黑盒:在不知道程序内部结构,仅仅知道程序结构的情况下採用的測试技术或策略. 白盒:在知道程序内部结构的情况下採用的測试技术或策略. 两种測试方法从不同的角度出发,反映了软件的不同側 ...
- 【Oracle】物理体系结构
一.ORACLE 物理体系结构 原理结构图 各部分解释: PGA: 私有内存区,仅供当前发起用户使用. 三个作用 用户登录后的session信息会保存在PGA. 运行排序.假设内存不够,orac ...
- Preview of Spring-framework :Spring框架的预习和自我整理
Spring简介 - 预习的自我整理 1. What's Spring? Spring是一个从实际开发中抽取出来的框架,完成了大量开发中的通用步骤,留给开发者仅仅是与特定应用相关的部分,从而提高了企业 ...
- 如何解决Windows8.1(32bit&64bit)下Cisco VPN Client拨号时报442错误的问题
Cisco VPN Cient大多数网络管理员.技术支持project最流行的教师和最终用户VPNclient一间.对于外部网络访问内部网络,技术类人员. 随着Windows8.1的推出.Cisco ...
- hadoop版本号变迁
近期在研究hadoop时,发现hadoop的版本号非常混乱.原来的版本号都说0.X.X開始,后来发现有1.X.X和2.X.X 这样就不太清楚了. 0.20.2版本号曾经(不含该版本号)的配置文件都在d ...
- Oracle 基于 RMAN 的不完全恢复(incomplete recovery by RMAN)
Oracle 数据库可以实现数据库不完全恢复与完全恢复.完全恢复是将数据库恢复到最新时刻,也就是无损恢复,保证数据库无丢失的恢复.而不完全恢复则是根据需要特意将数据库恢复到某个过去的特定时间点或特定的 ...
- 傻瓜式破解linux--rootpassword
破password的方法: 方法1.单用户模式改动 (表示进入到单用户模式) .按回车键.按b键启动.进入单用户模式,进行password改动.重新启动 init 5 口诀:e2e 空格1 回车b 开 ...
- Java Web整合开发(78) -- Struts 1
在Struts1.3中已经取消了<data-sources>标签,也就是说只能在1.2版中配置,因为Apache不推荐在 struts-config.xml中配置数据源.所以建议不要在st ...
- iOS缓存类的设计
使用执行速度缓存的程序可以大大提高程序,设计一个简单的缓存类并不需要太复杂的逻辑. 只需要一个简单的3接口. 存款对象 以一个对象 删除对象 阅读对象 watermark/2/text/aHR0cDo ...
- 同TextView在不同的显示内容
首先,请原谅我不能命名文章.. . 我们不能准确地表达你说说什么什么,真正急着赶智商. 直接在地图上 如图所看到的显示的是两个textview 第一个实现的是,在同一个textview中给不同内容赋予 ...