不仅有一种可能的解决方案,而且我将保持接近您的代码.由于这是家庭作业,我不会给你一个有效的答案,但我会尽量给你一些思考的东西,并给出详细的指示:
尝试了解您的代码的作用以及您真正希望它执行的操作:
(defun remove-all (a l)
(cond ((null l) nil)
((eql (car l) a) (delete a (cdr l)))
(t (cons (car l) (delete a (cdr l))))))
(重命名为remove-all,因为已经进行了删除,并以理智的方式重新缩进.)
对于平面列表,代码似乎有效;但嵌套列表怎么样?让我们看一个简单的例子:
>如果你评估会发生什么(删除所有1′((1)))?
>你想为这个输入做些什么?
>你怎么能实现它?
让我们来看看:
>会发生什么:
>列表不为null,继续
>汽车不是等待1继续
>'(1)得到(删除所有'()),屈服'((1))
因此,它没有认识到汽车本身就是一个应该搜索匹配元素的列表.问题似乎在第一步和第二步之间.
>应该做什么:
>检查,如果汽车本身就是一个清单
>如果是,请调用remove-all
>然后,将结果归结为cdr,这也需要“清理”(提示:但只有在有缺陷的情况下)
>究竟怎么样?
>添加一个cond子句,它执行2中提到的事情 – 左边作为家庭作业