递归模式:保留

第三种递归模式称为保留模式。 在保留递归模式中,测试列表的每个元素; 只有在元素满足条件时,对该元素进行操作并仅保留结果。

同样,这与每个模式非常相似,只是除非元素满足条件,否则将跳过该元素。

该模式有三个部分:

以下是一个使用cond的示例:

(defun keep-three-letter-words (word-list)
  "保留WORD-LIST中的三个字母的单词。"
  (cond
   ;; 第一个再次测试:停止条件
   ((not word-list) nil)

   ;; 第二个再次测试:何时操作
   ((eq 3 (length (symbol-name (car word-list))))
    ;; 将已操作的元素与对较短列表进行递归调用的结果组合
    (cons (car word-list) (keep-three-letter-words (cdr word-list))))

   ;; 第三个再次测试:何时跳过元素;
   ;;   以下一步表达式对较短列表进行递归调用
   (t (keep-three-letter-words (cdr word-list)))))

(keep-three-letter-words '(one two three four five six))
    ⇒ (one two six)

毫无疑问,您无需使用nil作为停止测试的条件;当然,您可以组合这些模式。