在every
递归模式中,对列表的每个元素执行一个操作。
基本模式如下:
nil
。
cons
结合。
以下是一个例子:
(defun square-each (numbers-list) "递归地计算NUMBERS LIST中的每个数字的平方。" (if (not numbers-list) ; do-again-test nil (cons (* (car numbers-list) (car numbers-list)) (square-each (cdr numbers-list))))) ; next-step-expression
(square-each '(1 2 3)) ⇒ (1 4 9)
如果numbers-list
为空,则不执行任何操作。但如果它包含内容,则构造一个列表,其中包含第一个数字的平方与递归调用的结果的结合。
(该示例完全遵循该模式:如果数字列表为空,则返回nil
。在实践中,您会编写条件语句,以便在数字列表不为空时执行操作。)
print-elements-recursively
函数(see Recursion with a List)是every
模式的另一个示例,不同之处在于,我们不使用cons
将结果组合在一起,而是逐个打印输出的每个元素。
print-elements-recursively
函数如下:
(setq animals '(gazelle giraffe lion tiger))
(defun print-elements-recursively (list) "逐行打印LIST中的每个元素。使用递归。" (when list ; do-again-test (print (car list)) ; body (print-elements-recursively ; recursive call (cdr list)))) ; next-step-expression (print-elements-recursively animals)
print-elements-recursively
的模式如下: