近来在重读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)解题总结。的更多相关文章

  1. SICP 习题 (1.7) 解题总结

    SICP 习题 1.7 是对正文1.1.7节中的牛顿法求平方根的改进,改进部分是good-enough?过程. 原来的good-enough?是判断x和guess平方的差值是否小于0.001,这个过程 ...

  2. SICP 习题 (1.14)解题总结

    SICP 习题 1.14要求计算出过程count-change的增长阶.count-change是书中1.2.2节讲解的用于计算零钱找换方案的过程. 要解答习题1.14,首先你需要理解count-ch ...

  3. SICP 习题 (1.8) 解题总结

    SICP 习题1.8需要我们做的是按照牛顿法求平方根的方法做一个求立方根的过程. 所以说书中讲牛顿法求平方根的内容还是要好好理解,不然后面这几道题做起来就比较困难. 反过来,如果理解了牛顿法求平方根的 ...

  4. SICP 习题 (1.9) 解题总结

    SICP 习题 1.9 开始针对“迭代计算过程”和“递归计算过程”,有关迭代计算过程和递归计算过程的内容在书中的1.2.1节有详细讨论,要完成习题1.9,必须完全吃透1.2.1节的内容,不然的话,即使 ...

  5. SICP 习题 (1.10)解题总结

    SICP 习题 1.10 讲的是一个叫“Akermann函数”的东西,去百度查可以查到对应的中文翻译,叫“阿克曼函数”. 就像前面的解题总结中提到的,我是一个数学恐惧者,看着稍微复杂一点的什么函数我就 ...

  6. SICP 习题 (1.13) 解题总结

    SICP习题1.13要求证明Fib(n)是最接近φn/√5 的整数,其中φ=(1+√5)/2 .题目还有一个提示,提示解题者利用归纳法和斐波那契数的定义证明Fib(n)=(φn - ψn) / √5 ...

  7. SICP 习题 (2.7) 解题总结 : 定义区间数据结构

    SICP 习题 2.7 開始属于扩展练习,能够考虑不做,对后面的学习没什么影响.只是,假设上面的使用过程表示序对,还有丘奇计数你都能够理解的话,完毕这些扩展练习事实上没什么问题. 习题2.7是要求我们 ...

  8. SICP 习题 (2.6) 解题总结:丘奇计数

    SICP 习题 2.6 讲的是丘奇计数,是习题2.4 和 2.5的延续. 这里大师们想提醒我们思考的是"数"究竟是什么,在计算机系统里能够怎样实现"数".准备好 ...

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

    SICP 习题 1.37是一条非常长的题目,主要讲的是无穷连分式.无穷连分式对我来说又是一个陌生的概念,于是又去百度了一番,发现无穷连分式也是一个非常有意思的话题,涉及到无理数的表达.只是我建议大家还 ...

  10. SICP 习题 (1.43)解题总结

    SICP 习题 1.43 是前面两道题的延续,习题要求我们定义一个过程(repeat f n) .当中f是一个单參数过程.题目要求我们通过repeat过程将过程f调用n次,注意是嵌套调用n次,不是连续 ...

随机推荐

  1. 讨论UML概念和模型UML九种图。

    文件夹: UML的视图 UML的九种图 UML中类间的关系 上文我们介绍了,UML的视图.在每一种视图中都包括一个或多种图. 本文我们重点解说UML每种图的细节问题: 1.用例图(use case d ...

  2. Linux/Unix使用valgrind内存泄漏检测

    c\c++程序设计.内存管理是一个比较头疼的问题.相信它会导致内存泄漏.除了外部养成良好的编程习惯(使用智能指针),使用该工具还可以帮助检测内存泄漏,valgrind这是Unix\Linux在一个很好 ...

  3. unity3d 数学的数学基础和辅助类

    转载注明smartdot:http://my.oschina.net/u/243648/blog/67193 1.  数学(点乘/叉乘)/unity3d的数学辅助类 2.  坐标系统(本地/世界/屏幕 ...

  4. 静态方法使用bean

    java类中的代码 public class BidMsgUtil { private static Logger log = Logger.getLogger(BidMsgUtil.class); ...

  5. 【原创】shadowebdict开发日记:基于linux的简明英汉字典(二)

    全系列目录: [原创]shadowebdict开发日记:基于linux的简明英汉字典(一) [原创]shadowebdict开发日记:基于linux的简明英汉字典(二) [原创]shadowebdic ...

  6. 光谱郑匡移动互联网O2O完美融合

    移动互联网尽管市场颇大,前景广阔,可是由于数据过于密集,非常难精准的定位所谓的目标客户群,然而O2O的线下市场却与互联网市场有极大的反差.一直认为高校周边的小商家是最幸福的生意人,客户明白(就是本校学 ...

  7. unity3d插入Daikon Forge GUI 中国课程-7-高级控制slider采用

    (游戏开始的牛市)大家好我是孙广东.官方网站提供的是专业的视频教程http://www.daikonforge.com/dfgui/tutorials/,只是是在youtube上,要观看是须要FQ的. ...

  8. 由单页面web应用引发的企业应用问题

    由于单页面web应用的流行,client与server端之间都对应的产生了一些微妙的变化,比方,client原来仅仅是用来展示页面和理清逻辑,而现在逐渐转变成了一个可以进入驱动状态的应用程序. 未来的 ...

  9. Android Application Thread CPU GC Operatiing and OOM Question 0603-随手笔记

    面前app当完成测试,没问题,以完成整个老龄化阶段包含数据收发器,关键在 adb shell top -m 5  我发现我的 app pid 占用  CPU是最多的,事实上我想说写一个app是不难,你 ...

  10. Hibernate学习笔记(1)Hibernate构造

    一 准备工作 首先,我们将创建一个简单的基于控制台(console-based)Hibernate应用. 我们所做的第一件事就是创建我们的开发文件夹.并把所有需要用到的Java件放进去.解压缩从Hib ...