SICP 解题集
这个文档的目标是成为中文化的、完整的《计算机程序的构造和解释》一书的解题集。
这个解题集的特色是:
相关软件和链接 介绍了这个解题集中用到的程序和工具。
第一章: 构造过程抽象
-
1.1 程序设计的基本元素
-
1.2 过程与它们所产生的计算
-
1.3 用高阶函数做抽象
第二章: 构造数据抽象
-
2.1 数据抽象导引
-
2.2 层次性数据和闭包性质
- 2.2.1 序列的表示(练习 2.17,练习 2.18,练习 2.19,练习 2.20,练习 2.21,练习 2.22,练习 2.23)
- 2.2.2 层次性结构(练习 2.24,练习 2.25,练习 2.26,练习 2.27,练习 2.28,练习 2.29,练习 2.30,练习 2.31,练习 2.32)
- 2.2.3 序列作为一种约定的界面(练习 2.33,练习 2.34,练习 2.35,练习 2.36,练习 2.37,练习 2.38,练习 2.39,练习 2.40,练习 2.41,练习 2.42,练习 2.43)
- 2.2.4 实例: 一个图形语言(练习 2.44,练习 2.45,练习 2.46,练习 2.47,练习 2.48,练习 2.49,练习 2.50,练习 2.51,练习 2.52)
-
2.3 符号数据
-
2.4 抽象数据的多重表示
-
2.5 带有通用型操作的系统
第三章: 模块化、对象和状态
-
3.1 赋值和局部状态
-
3.2 求值的环境模型
-
3.3 用变动数据做模拟
-
3.4 并发:时间是一个本质问题
-
3.5 流
- 3.5.1 流作为延时的表(练习 3.50,练习 3.51,练习 3.52)
- 3.5.2 无穷流(练习 3.53,练习 3.54,练习 3.55,练习 3.56,练习 3.57,练习 3.58,练习 3.59,chp3/60,chp3/61,chp3/62)
- 3.5.3 流计算模式的使用(练习 3.63,练习 3.64,练习 3.65,练习 3.66,chp3/67,chp3/68,chp3/69,chp3/70,chp3/71,chp3/72,chp3/73,chp3/74,chp3/75,chp3/76)
- 3.5.4 流和延时求值(chp3/77,chp3/78,chp3/79,chp3/80)
- 3.5.5 函数式程序的模块化和对象的模块化(chp3/81,chp3/82)
第四章: 元语言抽象
-
4.1 元循环求值器
-
4.2 Scheme 的变形 —— 惰性求值
- 4.2.1 正则序和应用序(chp4/25,chp4/26)
- 4.2.2 一个采用惰性求值的解释器(chp4/27,chp4/28,chp4/29,chp4/30,chp4/31)
- 4.2.3 将流作为惰性的表(chp4/32,chp4/33,chp4/34)
-
4.3 Scheme 的变形 —— 非确定性求值
- 4.3.1 amb 和搜索(chp4/35,chp4/36,chp4/37)
- 4.3.2 非确定性程序的实例(chp4/38,chp4/39,chp4/40,chp4/41,chp4/42,chp4/43,chp4/44,chp4/45,chp4/46,chp4/47,chp4/48,chp4/49)
- 4.3.3 实现 amb 求值器(chp4/50,chp4/51,chp4/52,chp4/53,chp4/54)
-
4.4 逻辑程序设计
- 4.4.1 演绎信息检索(chp4/55,chp4/56,chp4/57,chp4/58,chp4/59,chp4/60,chp4/61,chp4/62,chp4/63)
- 4.4.2 查询系统如何工作
- 4.4.3 逻辑程序设计是数理逻辑吗(chp4/64,chp4/65,chp4/66,chp4/67,chp4/68,chp4/69)
- 4.4.4 查询系统的实现(chp4/70,chp4/71,chp4/72,chp4/73,chp4/74,chp4/75,chp4/76,chp4/77,chp4/78,chp4/79)
第五章: 寄存器机器里的计算
-
5.1 寄存器机器的设计(chp5/1)
- 5.1.1 一种描述寄存器机器的语言(chp5/2)
- 5.1.2 机器设计的抽象(chp5/3)
- 5.1.3 子程序
- 5.1.4 采用堆栈实现递归(chp5/4,chp5/5,chp5/6)
- 5.1.5 指令总结
-
5.2 一个寄存器机器模拟器(chp5/7)
- 5.2.1 机器模型
- 5.2.2 汇编程序(chp5/8)
- 5.2.3 为指令生成执行过程(chp5/9,chp5/10,chp5/11,chp5/12,chp5/13)
- 5.2.4 监视机器执行(chp5/14,chp5/15,chp5/16,chp5/17,chp5/18,chp5/19)
-
5.3 存储分配和废料收集
- 5.3.1 将存储看作向量(chp5/20,chp5/21,chp5/22)
- 5.3.2 维持一种无穷存储的假象
-
5.4 显式控制的求值器
- 5.4.1 显式控制求值器的内核
- 5.4.2 序列的求值和尾递归
- 5.4.3 条件、赋值和定义(chp5/23,chp5/24,chp5/25)
- 5.4.4 求值器的运行(chp5/26,chp5/27,chp5/28,chp5/29,chp5/30)
-
5.5 编译
- 5.5.1 编译器的结构(chp5/31,chp5/32)
- 5.5.2 表达式的编译
- 5.5.3 组合式的编译
- 5.5.4 指令序列的组合
- 5.5.5 编译代码的实例(chp5/33,chp5/34,chp5/35,chp5/36,chp5/37,chp5/38)
- 5.5.6 词法地址(chp5/39,chp5/40,chp5/41,chp5/42,chp5/43,chp5/44)
- 5.5.7 编译代码和求值器的互连(chp5/45,chp5/46,chp5/47,chp5/48,chp5/49,chp5/50,chp5/51,chp5/52)
项目进度
目前项目仍处于开发阶段,贡献、提交建议或意见,请到项目的 github 页面: https://github.com/huangz1990/SICP-answers 。
关于
这个解题集的绝大部分练习由 huangz 完成,在我遇上解不出的问题时, Eli Bendersky 的 SICP 解答 和 sicp.org.ua 上的 WIKI 总能给我很大帮助,在此对他们表示感谢。
你可以免费下载、阅读、复制、传播和修改本文档及相应的代码示例,如果需要其他使用许可,请用以下任一方式联系本人:向 gmail 帐号 huangz1990 发送邮件 / 豆瓣 / twitter