启迪
Scheme 五法 :
1. car之法则 : 经典元件 car 仅定义为针对非空列表。
2. cdr之法则 : 经典元件 cdr 仅定义为针对非空列表。任意非空列表的 cdr 总是另一个列表。
3. cons 之法则 : 经典元件 cons 需要两个参数。第二个参数必须是一个列表。结果是一个列表。
4. null? 之法则 : 经典元件仅定义为针对列表。
5. eq? 之法则 : 基本元件 eq? 需要两个参数。每个参数都必须是一个非数字的原子。
Scheme 十诫 :
1. (预备式)当表述任意函数时,总是将询问 null? 作为诸问题之首。
(终极式)当对一个原子列表 lat 进行递归调用时,询问两个有关 lat 的问题: (null? lat) 和 else。
当对一个数字进行递归调用时,询问两个有关 n 的问题: (zero? n) 和 else。
当对一个 S- 表达式列表 l 进行递归调用时,询问三个有关 l 的问题:(null? lat)、(atom? (car l))、else.
2. 使用 cons 来构建列表。
3. 构建一个列表的时候,描述第一个典型元素,之后 cons 该元素到一般性递归上。
4. 在递归时总是改变至少一个参数。该参数必须向着不断接近结束条件而改变。改变的参数必须在结束条件中得以测试:当使用 cdr 时,用 null? 测试是否结束;当使用 sub1 时,用 zero? 测试是否结束。
5. 当用 + 构建一个值时,总是使用 0 作为结束代码行的值,因为加上0不会改变加法的值。
当用 * 构建一个值时,总是使用1作为结束代码行的值,因为乘以1不会改变乘法的值。
当用 cons 构建一个值时,总是考虑把 () 作为结束代码行的值。
6. 简化工作只能在功能正确之后开展。
7. 对具有相同性质的子部件进行递归调用:列表的子列表;算术表达式的子表达式。
8. 使用辅助函数来抽象表示方式。
网友评论