过程与它们所产生的计算
- 理解如何编程:
- 编程领域中各种有用的常见模式;
- 哪些过程值得定义;
- 对执行一个过程的效果做出预期:
- 学会去看清各种不同种类的过程会产生什么样的计算过程。
- 一个过程也就是一种模式,它描述了一个计算过程的局部演化方式,描述了这一计算 过程中的每个步骤是怎样基于前面的步骤建立起来的。
线性的递归和迭代
- 递归计算过程(本节中是线性递归过程)
- 执行时,这样的计算过程构造起一个推迟进行的操作所形成的链条,链条的长度 也就是为保存其轨迹解释器需要保存的信息量,长度是线性增长的;当链条达到 最大时,收缩阶段开始并表现为这些运算的实际执行;
- 这种类型的计算过程由此运算链条所刻画;
- 计算步骤线性增长,存储空间线性增长;
- 解释器维持着程序变量之外的与计算状态相关的一些隐含信息。
- 迭代计算过程(本节中是线性迭代过程)
- 没有任何增长或收缩,其计算过程就是那种其状态可以用固定数目的状态变量描 述的计算过程;
- 存在这一套固定的法则描述了计算过程从一个状态到下一个状态转换时这些变量 的更新方式(可能还有一个结束检测);
- 计算步骤线性增长,存储空间是常量;
- 状态变量提供了计算状态的完整描述。
- 递归过程:语法形式;递归计算过程:计算过程的进展方式;
- 尾递归:在常量空间种执行迭代型计算过程,即使这一计算是用一个递归过程描述的。
练习 1.9-1.10
1.9
|
|
1.10
|
|
树形递归
- 树形递归的计算步骤增长相对于线性增长来说要快的多,可能极其低效;
- 但并不是说树形递归就是没有用的:
- 树形递归更容易描述和理解;
- 当在层次结构性的数据上操作而不是对数操作时,它是一种自然的威力强大的工 具;
- 即使是对于数的计算,树形递归也是具有启发意义的,可以帮助我们理解和设计 程序;
练习 1.11-1.13
1.11
|
|
1.12
|
|
1.13
|
|
增长的阶
- 增长的阶为我们提供了对计算过程行为的一种很粗略的描述;
- 增长的阶也为我们在问题规模改变时,预期一个计算过程的行为变化(比如占用资 源)提供了有用的线索。
练习 1.14-1.15
1.14
|
|
1.15
|
|
求幂
- 使用求幂的例子引出增长的阶为对数增长,而不是线性增长的递归计算过程,是对 增长的阶的继续深入和补充。
练习 1.16-1.19
1.16
|
|
1.17
|
|
1.18
|
|
1.19
|
|
最大公约数
- 求最大公约数的欧几里得算法及实现,计算步骤对数增长。
练习 1.20
1.20
|
|
实例:素数检测
- 费马检查做素数检测的代码实现是一种概率方法。
练习 1.21-1.28
1.21
|
|
1.22
|
|
1.23
|
|
1.24
|
|
1.25
|
|
1.26
|
|
1.27
|
|
1.28
|
|