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)))