热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

SICP解题集¶

SICP解题集这个文档的目标是成为中文化的、完整的《计算机程序的构造和解释》一书的解题集。这个解题集的特色是:对于每道习题,除了习题答案之外ÿ

SICP 解题集

这个文档的目标是成为中文化的、完整的《计算机程序的构造和解释》一书的解题集。

这个解题集的特色是:


对于每道习题,除了习题答案之外,还给出习题的讲解和相关资料(如果有的话);
使用 MIT Scheme 作为编程环境,完全避免了代码不兼容的问题;
所有代码都经过测试,确保准确性。

相关软件和链接 介绍了这个解题集中用到的程序和工具。


第一章: 构造过程抽象

  • 1.1 程序设计的基本元素

    • 1.1.1 表达式
    • 1.1.2 命名和环境
    • 1.1.3 组合式的求值
    • 1.1.4 复合过程
    • 1.1.5 过程应用的代换模型
    • 1.1.6 条件表达式和谓词(练习 1.1,练习 1.2,练习 1.3,练习 1.4,练习 1.5)
    • 1.1.7 实例: 采用牛顿法求平方根(练习 1.6,练习 1.7,练习 1.8)
    • 1.1.8 过程作为黑箱抽象
  • 1.2 过程与它们所产生的计算

    • 1.2.1 线性的递归和迭代(练习 1.9,练习 1.10)
    • 1.2.2 树形递归(练习 1.11,练习 1.12,练习 1.13)
    • 1.2.3 增长的阶(练习 1.14,练习 1.15)
    • 1.2.4 求幂(练习 1.16,练习 1.17,练习 1.18,练习 1.19)
    • 1.2.5 最大公约数(练习 1.20)
    • 1.2.6 实例: 素数检测(练习 1.21,练习 1.22,练习 1.23,练习 1.24,练习 1.25,练习 1.26,练习 1.27,练习 1.28)
  • 1.3 用高阶函数做抽象

    • 1.3.1 过程作为参数(练习 1.29,练习 1.30,练习 1.31,练习 1.32,练习 1.33)
    • 1.3.2 用 lambda 构造过程(练习 1.34)
    • 1.3.3 过程作为一般性的方法(练习 1.35,练习 1.36,练习 1.37,练习 1.38,练习 1.39)
    • 1.3.4 过程作为返回值(练习 1.40,练习 1.41,练习 1.42,练习 1.43,练习 1.44,练习 1.45,练习 1.46)


第二章: 构造数据抽象

  • 2.1 数据抽象导引

    • 2.1.1 实例: 有理数的算术运算(练习 2.1)
    • 2.1.2 抽象屏障(练习 2.2,练习 2.3)
    • 2.1.3 数据意味着什么(练习 2.4,练习 2.5,练习 2.6)
    • 2.1.4 扩展练习: 区间算术(chp2/7,chp2/8,chp2/9,chp2/10,chp2/11,chp2/12,chp2/13,chp2/14,chp2/15,chp2/16)
  • 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.3.1 引号(练习 2.53,练习 2.54,练习 2.55)
    • 2.3.2 实例: 符号求导(练习 2.56,练习 2.57,练习 2.58)
    • 2.3.3 实例: 集合的表示(练习 2.59,练习 2.60,练习 2.61,练习 2.62,练习 2.63,练习 2.64,练习 2.65,练习 2.66)
    • 2.3.4 实例: Huffman 编码树(练习 2.67,练习 2.68,练习 2.69,练习 2.70,练习 2.71,练习 2.72)
  • 2.4 抽象数据的多重表示

    • 2.4.1 复数的表示
    • 2.4.2 带标志数据
    • 2.4.3 数据导向的程序设计的可加性(练习 2.73,练习 2.74,练习 2.75,练习 2.76)
  • 2.5 带有通用型操作的系统

    • 2.5.1 通用型算术运算(练习 2.77,练习 2.78,练习 2.79, 练习 2.80)
    • 2.5.2 不同类型数据的组合(练习 2.81,chp2/82,chp2/83,chp2/84,chp2/85,chp2/86)
    • 2.5.3 实例: 符号代数(chp2/87,chp2/88,chp2/89,chp2/90,chp2/91,chp2/92,chp2/93,chp2/94,chp2/95,chp2/96,chp2/97)


第三章: 模块化、对象和状态

  • 3.1 赋值和局部状态

    • 3.1.1 局部状态变量(练习 3.1,练习 3.2,练习 3.3,练习 3.4)
    • 3.1.2 引进赋值带来的利益(练习 3.5,练习 3.6)
    • 3.1.3 引进赋值的代价(练习 3.7,练习 3.8)
  • 3.2 求值的环境模型

    • 3.2.1 求值规则
    • 3.2.2 简单过程的应用(练习 3.9)
    • 3.2.3 将框架看作局部状态的展台(练习 3.10)
    • 3.2.4 内部定义(练习 3.11)
  • 3.3 用变动数据做模拟

    • 3.3.1 变动的表结构(练习 3.12,练习 3.13,练习 3.14,练习 3.15,练习 3.16,练习 3.17,练习 3.18,练习 3.19,练习 3.20)
    • 3.3.2 队列的表示(练习 3.21,练习 3.22,练习 3.23)
    • 3.3.3 表格的表示(练习 3.24,练习 3.25,练习 3.26,练习 3.27)
    • 3.3.4 数字电路的模拟器(练习 3.28,练习 3.29,练习 3.30,练习 3.31,练习 3.32)
    • 3.3.5 约束的传播(练习 3.33,练习 3.34,练习 3.35,练习 3.36,练习 3.37)
  • 3.4 并发:时间是一个本质问题

    • 3.4.1 并发系统中时间的性质(练习 3.38)
    • 3.4.2 控制并发的机制(练习 3.39,练习 3.40,练习 3.41,练习 3.42,练习 3.43,练习 3.44,练习 3.45,练习 3.46,练习 3.47,练习 3.48,练习 3.49)
  • 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.1.1 求值器的内核(练习 4.1)
    • 4.1.2 表达式的表示(练习 4.2,练习 4.3,练习 4.4,练习 4.5,练习 4.6,练习 4.7,练习 4.8,练习 4.9,练习 4.10)
    • 4.1.3 求值器数据结构(练习 4.11,练习 4.12,练习 4.13)
    • 4.1.4 作为程序运行这个求值器(练习 4.14)
    • 4.1.5 将数据作为程序(chp4/15)
    • 4.1.6 内部表示(chp4/16,chp4/17,chp4/18,chp4/19,chp4/20,chp4/21)
    • 4.1.7 将语法分析和执行分离(chp4/22,chp4/23,chp4/24)
  • 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 。



下载离线版本

HTML 格式

注意,因为文档总是在不断地更新和修正当中,请定期下载最新的离线文档,确保获得最好的阅读体验。



关于

这个解题集的绝大部分练习由 huangz 完成,在我遇上解不出的问题时, Eli Bendersky 的 SICP 解答 和 sicp.org.ua 上的 WIKI 总能给我很大帮助,在此对他们表示感谢。

你可以免费下载、阅读、复制、传播和修改本文档及相应的代码示例,如果需要其他使用许可,请用以下任一方式联系本人:向 gmail 帐号 huangz1990 发送邮件 / 豆瓣 / twitter



讨论 ¶




推荐阅读
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • python的交互模式怎么输出名文汉字[python常见问题]
    在命令行模式下敲命令python,就看到类似如下的一堆文本输出,然后就进入到Python交互模式,它的提示符是>>>,此时我们可以使用print() ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 解决PHP与MySQL连接时出现500错误的方法
    本文详细探讨了当使用PHP连接MySQL数据库时遇到500内部服务器错误的多种解决方案,提供了详尽的操作步骤和专业建议。无论是初学者还是有经验的开发者,都能从中受益。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • 本文详细介绍了美国最具影响力的十大财团,包括洛克菲勒、摩根、花旗银行等。这些财团在历史发展过程中逐渐形成,并对美国的经济、政治和社会产生深远影响。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
author-avatar
学海无涯
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有