https://mitpress.mit.edu/sites/default/files/sicp/index.html 本书官网
http://www.math.pku.edu.cn/teachers/qiuzy/books/sicp/errata.htm 中译本勘误表
https://blog.csdn.net/weixin_33894640/article/details/89416538 mit为何停掉SICP
https://sicp.readthedocs.io/en/latest/ SICP解题集
lisp是函数式语言
序:
编程不只是堆砌API,还有程序设计,算法,数据结构。
各种数据结构算法的优缺点,这些是基本功。对底层实现的了解,可以让你优化代码,提高性能。如P10
程序结构清晰,易读。代码优美。用好的算法,好的数据结构。
第一章:过程的抽象
定义变量就是将一个变量名和值关联起来,这个关联是什么实现的,是用了某种数据结构吗?
加号减号在全局环境中,像变量一样,和某个相应的指令序列相关联,加号就是变量名。这是简单运算的部分实现。
define属于特殊形式。简单运算是组合式。
变量都有作用域,这又是如何实现的?
环境在lisp这样的交互语言中是至关重要的,没有环境,符号x就没有意义,甚至于加号减号也要环境赋予意义。
还有最简单的表达式求值的实现?
编译器和解释器的区别?
组合式求值规则,里面可以包含复合过程。define属于特殊形式,不同与组合式求值。
求值模型有:正则序求值和应用序求值。
线性迭代过程和递归计算过程的区别P23
递归过程和递归计算过程不一样。线性迭代过程和递归计算过程都用了递归,即调用了自身。线性迭代过程和递归计算过程是计算机过程的进展方式
平时用的for等等循环语句都是迭代的。
那线性迭代过程和递归计算过程的优缺点呢?
树形递归可能及其低效,但容易描述和理解。会产生许多冗余计算。递归深度受限于解释器所允许的最大递归深度
树形递归的题的思路都是自底向上。
时间复杂就是需要几步完成,而空间可以简单理解成程序展开后的胖瘦。
算法和数学挂钩,设计递归算法,迭代算法的能力。什么时候用递归,什么时候用迭代,算空间时间复杂度。
第一章主要讲了两种抽象:
第一步抽象:把一些数值操作定义成方法;第二步抽象:找出模式,把方法作为数值操作,模式不变,改变数值(方法)就行
都是关于过程的抽象
第二章:构造数据抽象