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次,不是连续 ...
随机推荐
- Conversion to Dalvik format failed with error 1
主要和添�的第三方的包有关系. ======================================= 出现,Conversion to Dalvik format failed with e ...
- vultr centos x64 6.5.x 升级php7.0
升级前,先卸载 php5.6.x 卸载php5.6.2 从cent 6.5.x 需要卸载: yum remove php56u-mysqlnd-5.6.20-1.ius.centos6.x86_64 ...
- 左右PHP自增力、神秘递减操作
首先看一个面试题: $a = 1; $b = &$a; if ($b == $a++) echo "true"; else echo "false"; ...
- DiskFileUpload类别
1.2.2 DiskFileUpload类 DiskFileUpload类是Apache文件上传组件的核心类,应用程序开发者通过这个类来与Apache文件上传组件进行交互.以下介绍DiskFileUp ...
- Java equals的一个坑
public class StringEqualsObject { public static void main(String[] args) { String name="Tom&quo ...
- ASP.NET MVC 5 入门摘要
翻译和编辑的第一阶段后,.我们已经发出12片ASP.NET MVC 5入门文章. 他们中的大多数来自翻译ASP.NET MVC 5 官方教程,因为本系列文章言简意赅,篇幅适中,从一个web站点演示样例 ...
- Git显示漂亮日志的小技巧
Git的传统log如下所示,你喜欢吗? 看看下面这个你喜不喜欢?(点击图片看大图) 要做到这样,命令行如下: 1 git log --graph --pretty=format:'%Cred%h%Cr ...
- atitit.404错误调查过程汇总
atitit.404错误调查过程汇总 #----------jsp head errorPage="" del zeu ok le. #------resin server. ...
- Apple Watch 1.0 开发介绍 1.1 简介 开发苹果手表
使用Apple Watch,用户可以使用一种不显眼的方式查看信息.不用把iPhone从口袋里拿出来,就可以通过看一下手表快速获得重要信息. 作为Apple Watch的第三方app开发者,应该通过使用 ...
- Zen Coding 快速编写HTML/CSS代码的实现
在本文中我们将展示一种新的使用仿CSS选择器的语法来快速开发HTML和CSS的方法.它由Sergey Chikuyonok开发. 你在写HTML代码(包括所有标签.属性.引用.大括号等)上花费多少时间 ...