求助:实现递归函数SORT-LIST筛选列表指定元素
修复递归筛选函数SORT-LIST的问题
首先你写的代码存在两个核心问题:
- 语法错误:
cond的第一个子句((null l) nil)后面多了一个闭合括号,导致cond提前结束,后面的表达式变成独立的顶级形式,运行时会直接报错。 - 参数设计不符合需求:题目要求用可选变量指定筛选目标(默认是"apples"),但你当前的
x是必填参数,没有设置默认值。
以下是修正后的代码,完全满足需求:
(defun sort-list (l &optional (x "apples")) (cond ((null l) nil) ((equal (first l) x) (cons (first l) (sort-list (rest l) x))) (t (sort-list (rest l) x))))
代码说明:
- 参数调整:把待处理列表
l作为第一个参数,筛选目标x设为可选参数,默认值为"apples"。这样调用时可以直接传列表,默认筛选苹果;也可以手动指定x来筛选其他元素。 - 修复
cond结构:所有判断子句都放在cond的同一组括号内,最后用t(代表“真”)处理剩余情况,避免冗余的重复判断。 - 递归逻辑:
- 当列表为空
(null l)时,返回空列表,作为递归的终止条件。 - 如果当前元素等于目标
x,就把它加入结果列表,再递归处理剩余元素。 - 如果当前元素不是目标,直接递归处理剩余元素。
- 当列表为空
测试示例:
调用(sort-list '("apples" "peas" "apples" "peas")),会返回("apples" "apples");
如果要筛选"peas",可以传可选参数:(sort-list '("apples" "peas" "apples" "peas") "peas"),返回("peas" "peas")。
内容的提问来源于stack exchange,提问作者CL-Beginner Zoni
相关产品推荐
相关产品推荐

