递归模式:每个元素

every递归模式中,对列表的每个元素执行一个操作。

基本模式如下:

以下是一个例子:

(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的模式如下: