一、递归(recursive code)
1. 常见的递归定义
a) 数据结构:树,堆
b) 操作:类型推断(type inference),类型合一(unification)
c) 数学实体:斐波纳契树,分形图
d) 算法:快速排序,树遍历,递归下降分析
注:基准范例的定义(base case definition)一般会定义一个特例,它不依赖于递归定义,从而避免陷入无限循环。
2. 常用的递归函数
a) 互递归(mutual recursion):通过调用其他函数间接包含自身。
b) 尾递归(tail recursion):递归调用恰恰发生在函数返回点之前,可被编译器优化为简单的跳转。
注:迭代不同于递归,它只是简单的循环,不涉及函数的扩展。递归发生在逐渐加深的层次上,而迭代始终在同一层中。
二、异常(exception)
1. 基于信号(signal)的错误处理:信号处理器
2. 基于异常的错误处理:异常作为语言的一部分(而非由库提供的功能),能够沿着程序的词法和函数的调用栈传播,允许程序员以结构化的方式处理它们。
三、并行处理(parallelism)
1. 工作群模型(work crew model):一系列相似的任务并行运转
2. 管理者∕工人模式(boss/worker model):一个管理者为不同的工人分配工作
例如:Unix系统中的sendmail函数
3. 流水线模型(pipeline model):对数据进行操作并将处理后的数据传递给下一个任务的一系列任务
例如:Unix基于过滤器的程序(filter-based program)
四、非局部跳转(non-local jump)
C函数库中的setjmp和longjmp函数
五、宏替换(macro substitution)
(参考《Code Reading-The Open Source Perspective》第五章)