第三种递归模式称为保留
模式。
在保留
递归模式中,测试列表的每个元素;
只有在元素满足条件时,对该元素进行操作并仅保留结果。
同样,这与每个
模式非常相似,只是除非元素满足条件,否则将跳过该元素。
该模式有三个部分:
nil
。
cons
与
以下是一个使用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
作为停止测试的条件;当然,您可以组合这些模式。