1. scheme十戒五律¶
1.1. scheme十戒¶
当对一个原子列表进行递归时,要注意两个问题:(null? lat) and else。
当对一个数字进行递归时,要注意两个问题:(zero? n) and else。
当对一个S表达式列表进行递归时,要注意三个问题:(null? l), (atom? (car l)) 和 else。
使用cons来创建列表。
当创建一个列表时,先描述第一个元素,然后用cons来将它和递归连接在一起
递归时,至少要改变一个参数。 例如:递归一个原子列表使用(cdr lat);递归一个数字使用(sub1 n);
递归一个S表达式时,如果这个表达式即不(null? l),也不(atom? (car l)), 那么使用(car l) 和 (cdr l)。
并且该参数必须要越来越接近终止元素。在终止条件里面必须要对正在变化的参数进行检查:
- 当使用cdr时,终止条件使用null?
- 当使用sub1时,终止条件使用zero?
当你使用+来创建一个值时,必须总要用0来作为终止,0加上任何值都不会改变原来的值。
当你使用*来创建一个值时,必须总要用1来作为终止,1乘以任务值都不会改变原来的值。
当你使用cons来创建一个值时,必须总要用()来作为终止。
当函数运行正确后再考虑简化函数。
当一个对象的子对象是与其本身表现一致时,这时候可用递归操作。比如:
- 一个列表的子列表
- 一个算术表达式的子表达式
使用辅助函数来简化表述。
使用新的函数来抽象公共模式。
创建连续函数时,尽量能够一次性获取更多的值。
1.2. scheme五律¶
- car函数最初只是用在非空列表上的。
- cdr函数最初只是用在非空列表上的,(cdr non-null-list)的结果是另一个列表。
- cons函数最初只接受两个参数,第二个参数必须是一个列表,它返回的结果也是一个列表。
- null?函数只对列表有用。
- eq?函数只接受两个参数,两个参数必须都是非数字的原子。