提取列表中的列表

asp*_*Bee 4 lisp common-lisp

我在从列表中提取列表时遇到问题.

(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在该内部列表中,则我的程序无法到达该内部列表内部.

dan*_*lei 5

不仅有一种可能的解决方案,而且我将保持接近您的代码.由于这是家庭作业,我不会给你一个有效的答案,但我会尽量给你一些思考的东西,并给出详细的指示:

尝试了解您的代码的作用以及您真正希望它执行的操作:

(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已经采用,并以理智的方式重新缩进.)

对于平面列表,代码似乎有效; 但嵌套列表怎么样?让我们看一个简单的例子:

  1. 如果你评估会发生什么(remove-all 1 '((1)))
  2. 你想为这个输入做些什么?
  3. 你怎么能实现它?

让我们来看看:

  1. 怎么了:

    • 列表不是null,继续
    • car不是eq1继续
    • '(1)得到cons(remove-all '()),屈服'((1))

    因此,它没有认识到它car本身就是一个应该搜索匹配元素的列表.问题似乎在第一步和第二步之间.

  2. 应该做什么:

    • 检查,如果car它本身是一个列表
    • 如果是,请调用remove-all
    • 然后,cons结果到了cdr,也需要"清理"(提示:但只有有东西的时候cons)
  3. 究竟怎么样?

    • 添加一个cond子句,它执行2中提到的事情 - 左边作为家庭作业