这一章开始引入了递归的概念。实现了2个函数:lat?和member?
lat?应该是a list of atoms的缩写,接受列表作为参数,并判断该列表的元素是否均为原子。 比如'(a b c)是一个lat,'(a (b) c)不是一个lat,作为特殊情况'()是一个lat。
member?接受一个原子和一个列表作为参数,并判断该原子是否存在于该列表中。 比如'a在'(a b c)中,'a不在'(b c d)中,当然'a也不在'()中。
看懂2段代码并非难事,难的是采用递归的方式去解决问题,而不是用遍历列表(迭代)的方式去解决,这一点属于质的区别。
递归还是迭代?
递归是在描述问题的定义,迭代是在描述具体怎么做的步骤。以lat?为例:
lat?的定义是:列表的第一个元素是原子的,且剩余的元素也是原子的。
如果换成迭代,大致会写成,遍历列表的每个元素,如果遇到非原子的元素则返回false,否则在完成遍历后返回true。
顺便提一个热知识,在scheme里没有迭代只有递归。
代码片段
(define lat?
(lambda (x)
(cond
((null? x) #t)
(else (and (atom? (car x)) (lat? (cdr x)))))))
(define member?
(lambda (a lat)
(cond
((null? lat) #f)
((eq? a (car lat)) #t)
(else (member? a (cdr lat))))))