十戒
-
第一戒
当递归原子列表
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)