我在从列表中提取列表时遇到问题.
(defun delete (a l)
(cond
((null l) nil)
((eq (car l) a) (delete a (cdr l)))
(t (cons (car l) (delete a (cdr l))))))
它删除列表中的'a',但如果l由另一个列表组成,并且a在该内部列表中,则我的程序无法到达该内部列表内部.
不仅有一种可能的解决方案,而且我将保持接近您的代码.由于这是家庭作业,我不会给你一个有效的答案,但我会尽量给你一些思考的东西,并给出详细的指示:
尝试了解您的代码的作用以及您真正希望它执行的操作:
(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))))))
Run Code Online (Sandbox Code Playgroud)
(重命名为remove-all因为delete已经采用,并以理智的方式重新缩进.)
对于平面列表,代码似乎有效; 但嵌套列表怎么样?让我们看一个简单的例子:
(remove-all 1 '((1)))?让我们来看看:
怎么了:
null,继续car不是eq要1继续'(1)得到cons了(remove-all '()),屈服'((1))因此,它没有认识到它car本身就是一个应该搜索匹配元素的列表.问题似乎在第一步和第二步之间.
应该做什么:
car它本身是一个列表remove-all它cons结果到了cdr,也需要"清理"(提示:但只有在有东西的时候cons)究竟怎么样?
cond子句,它执行2中提到的事情 - 左边作为家庭作业| 归档时间: |
|
| 查看次数: |
2113 次 |
| 最近记录: |