十戒
-
第一戒
当递归原子列表
lat
时,要思考:(null? lat)
和其他当递归数字
n
时,要思考:(zero? n)
和else
当递归s表达式
l
时列表时,要思考:
(null? l)
和else
(atom? (car l))
和else
-
第二戒
使用
cons
创建列表-
第三戒
当创建列表时,先写下第一个元素,然后通过递归方式使用
cons
来进行创建-
第四戒
当递归时,总是至少要改变一个参数
当递归原子列表
flat
时,使用(cdr lat)
当递归数字
n
时,使用(sub1 n)
当递归s表达式
l
时,当l
即不是(null ?)
也不是(atom? (car l))
时,使用(car l)
和(cdr l)
-
参数必须不断变化以达成结束条件。变化后的参数必须进行结束条件测试:
- 当使用
cdr
时,使用null?
测试是否结束 - 当使用
sub1
时,使用zero?
测试是否结束
- 当使用
-
第五戒
当使用
+
创建值时,使用0来作为结束,0不会改变加数的值当使用
*
来创建值时,使用1来作为结束,乘1不会改变乘数的值当使用
cons
来创建值时,应该考虑使用()
做为终结-
第六戒
函数正确是精简代码的前提
-
第七戒
当子组件与父组件相同,则可以用递归便利,如
列表中的子列表
算数表达式的子表达式
-
第八戒
使用辅助函数来抽象表现
-
第九戒
将共用部分抽象为一个新函数
-
第十戒
创建函数时尽量一次性接受可能多的值
五律
-
Car法则
- 原始(snsr)
car
只能用于非空列表
- 原始(snsr)
-
Cdr法则
原始(snsr)
cdr
只能用于非空列表cdr
产生一个新列表-
Cons法则
- 原始(snsr)
cons
接受两个参数 -
cons
的第二个参数必须为一个列表 - 结果是一个列表
- 原始(snsr)
-
Null?法则
- 原始(snsr)
null?
只对列表进行判断,只有当空列表时才返回#t
,否则返回#f
- 原始(snsr)
-
Eq?法则
- 原始(snsr)
eq?
接受两个参数 - 每个参数必须是非数字的原子
- 原始(snsr)