近来在重读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. Eclipse关闭检查

    有没有发现每次操作Eclipse过后,都会有build Workspace的操作一直在后台执行,JS校验一直validate,非常卡非常受不了有木有? 有木有?以下是我个人成功的步骤,曾经试过非常多次 ...

  2. .net读取异步Post的内容

    //读取微信Post过来的XML内容                 byte[] input = HttpContext.Current.Request.BinaryRead(HttpContext ...

  3. hihocoder第42周 k*N骨牌覆盖(状态dp+矩阵快速幂)

    上周的3*N的骨牌,因为状态只有8中,所以我们可以手算出状态转移的矩阵 但是这周是k*N,状态矩阵不好手算,都是我们改成用程序自动生成一个状态转移的矩阵就行了,然后用这个矩阵进行快速幂即可 枚举枚举上 ...

  4. android升级软件版本号,您安装后的新版本号,成功安装画面没有出现,或直接回到桌面

    Intent intent = new Intent(Intent.ACTION_VIEW); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //an ...

  5. wireshark教程

    Wireshark世界上最流行的网络分析工具. 这个强大的工具能够捕捉网络中的数据,并为用户提供关于网络和上层协议的各种信息.与非常多其它网络工具一样.Wireshark也使用pcap network ...

  6. java Socket使用详细解释

    客户/server通信模式, client需要主动创造和server Socket(套接字), server端收到了client的连接请求, 也会创建与客户连接的 Socket. Socket可看做是 ...

  7. SICP的一些个人看法

    网上搜书的时候,看到非常多人将这本书神话. 坦率地说,个人认为这本书过于学术化, 没什么实际project价值.一大堆题目也基本是高中数学竞赛题类似,浪费时间. 软件的核心技术是什么? 1>   ...

  8. Cocostudio学习笔记(4) LoadingBar+ TextField

    这同时录制两个控件的使用方法:LoadingBar和 TextField. -------------------------------------------------------------- ...

  9. 性能是全新的 SEO

    作为一个前端project师,那不只就是公开地处理那些美丽的html5, css3 和javascript特效.小而重要的一部分工作就是要让项目朝着代码稳定和代码标准方向进展.设计.信息结构以及后台限 ...

  10. Android KitKat 4.4 Wifi移植AP模式和网络共享的调试日志

    Tethering技术在移动平台上已经运用的越来越广泛了.它能够把移动设备当做一个接入点,其它的设备能够通过Wi-Fi.USB或是Bluetooth等方式连接到此移动设备.在Android中能够将Wi ...