《The Little Schemer》Chapter 2说了啥?

237 阅读1分钟

这一章开始引入了递归的概念。实现了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))))))