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