Recursion 如何递归遍历2个列表

Recursion 如何递归遍历2个列表,recursion,common-lisp,Recursion,Common Lisp,对于我的家庭作业问题,如果列表的一部分在另一个列表中,我必须删除列表中的重复项。预期结果应该是: (remove-redundant '((R (1 2 3 8 e 4 7 6 5)) (U (e 2 3 1 8 4 7 6 5)) (D (1 2 3 7 8 4 e 6 5))) '((D (1 2 3 e 8 4 7 6 5)) (L

对于我的家庭作业问题,如果列表的一部分在另一个列表中,我必须删除列表中的重复项。预期结果应该是:

(remove-redundant '((R (1 2 3 8 e 4 7 6 5))
                    (U (e 2 3 1 8 4 7 6 5))
                    (D (1 2 3 7 8 4 e 6 5)))

                  '((D (1 2 3 e 8 4 7 6 5))
                    (L (e 2 3 1 8 4 7 6 5))
                    (U (2 e 3 1 8 4 7 6 5))
                    (U (2 8 3 1 e 4 7 6 5))))
返回:

((R (1 2 3 8 e 4 7 6 5)) (D (1 2 3 7 8 4 e 6 5)))
应该检查每个列表中的列表,因为第一个参数出现在第二个参数中的任何位置。如果确实出现,则将其从第一个列表中删除。基本上,如果123E84765与第一个列表中的某个匹配,则将其从第一个列表中删除。我需要递归地做这个,它应该是一个函数程序

我已经尝试过递归列表,但它没有重置,即它将检查第二个列表中第一个列表的开头,然后返回

(defun same-state (l1 l2)
   (if (equal (cadr l1) (cadr l2)) t nil))

(defun remove-redundant (l1 l2)
  (cond
     ((null l2) l1)
     ((null l1) nil)
     ((same-state (car l1) (car l2)) (remove-redundant (cdr l1) (cdr l2))
     (T (remove-redundant l1 (cdr l2)))))

您将需要两个循环:一个循环遍历第一个列表,然后每个元素一个循环在第二个列表中查找匹配项。

您很接近了,但是在cond表单的t格中应该有一些要保留的单元格的累积, 例如

当您检查l1的第一个元素是否存在于l2中时,应该有另一个循环或递归来检查l2中的所有元素,例如


请修复格式问题:放入换行符,使用撇号“而不是打开单引号”,不要在空行上加括号。然后,请确切地解释为什么要删除U列表。次要的一点是,如果x t nil只是x,那么U列表将被删除,因为第一个列表中的内部列表与第二个列表中的内部列表匹配。
;; ...
(t
 (cons (car l1) (remove-redundant (cdr l1) (cdr l2))))
(defun same-state (l1 l2)
  (find l1 l2 :key #'cadr :test #'equal))

(defun remove-redundant (l1 l2)
  (cond
    ((null l2) l1)
    ((null l1) nil)
    ((same-state (cadar l1) l2)
     (remove-redundant (cdr l1) (cdr l2)))
    (t (cons (car l1)
             (remove-redundant (cdr l1) (cdr l2))))))
;; => ((R (1 2 3 8 e 4 7 6 5)) (D (1 2 3 7 8 4 e 6 5)))