SICP第一章笔记


第一章的内容相对来说比较基础

1.应用序和正则序

  • 正则序

首先不计算运算对象的值,首先展开原有的式子,直到实际需要的时候再计算。缺陷是可能有重复计算

  • 应用序

与正则序完全相反,首先求值,然后应用。

大部分情况下,两种方法得到的结果都是一样的。但是大部分的解释器现在都是应用序。正则序一方面会比较复杂,但另一方面它也可以特别有价值

一个辨别正则序和应用序的例子

如果是正则序,则不会陷入求p的循环中,而如果是应用序则会陷入死循环

2.迭代和递归

这也是我在重读SICP之前印象最深的一点,但是直到手写了几个函数之后才发现这两者之间真正的差别.

首先要声明,大部分情况下,迭代的效率都比递归更高。但是递归更加符合人们的直觉,即其易于理解。当我们把代码拆开之后,会发现迭代不仅占用的内存小,而且避免了很多重复计算。在处理大量数据时,建议还是使用迭代。

对于任何递归过程的解释,所需要消耗的内存总是和过程调用的数目成正比。而迭代过程则不受影响。

在代码结构上讲,迭代的特点我总结共3个本质特点

  • 最终需要输出的值一定是作为参数放在函数里
  • 在递归中需要调用到自身函数的时候,迭代里不再通过调用自己,而是有几个调用自己的次数就在迭代的函数里增加几个新的参数。
  • 迭代的版本中的判断条件一般是到了某个值之后,抛出结果的参量