List 使用Common Lisp删除多级列表中的重复项
删除多级列表中的重复项(使用Common Lisp),而不更改列表的内部结构。这个问题对我来说似乎是个难题,也是个大难题 来源列表: (12(65)23(54))==>结果:(1(6)23(54)) 以下是我不工作的决定: 利斯沃克斯: (取消F(l和可选)(lst(删除重复项(展平l))) 我试图使用lst来保持一个清晰的集合(1、2、6、5、3、4),每次添加新元素时,我都试图从这个集合中删除一个元素。 但我得到的是几乎相同的源序列(并行递归…): (12(65)23(54))==>(12(65)3(54)) (f'(А((B C E)D(B E A)))==>(А((B C E)D(B E A))) 然后我在网上搜索,但没有解决这个问题的决定。试试这个:List 使用Common Lisp删除多级列表中的重复项,list,duplicates,lisp,common-lisp,multi-level,List,Duplicates,Lisp,Common Lisp,Multi Level,删除多级列表中的重复项(使用Common Lisp),而不更改列表的内部结构。这个问题对我来说似乎是个难题,也是个大难题 来源列表: (12(65)23(54))==>结果:(1(6)23(54)) 以下是我不工作的决定: 利斯沃克斯: (取消F(l和可选)(lst(删除重复项(展平l))) 我试图使用lst来保持一个清晰的集合(1、2、6、5、3、4),每次添加新元素时,我都试图从这个集合中删除一个元素。 但我得到的是几乎相同的源序列(并行递归…): (12(65)23(54))==>(12(
(defun multi-level-list-remove-duplicates (tree)
(let ((seen NIL))
(labels ((rec (l)
(cond
((null l) NIL)
((consp (car l)) (cons (rec (car l))
(rec (cdr l))))
((member (car l) seen) (rec (cdr l)))
(T (push (car l) seen)
(cons (car l) (rec (cdr l)))))))
(rec tree))))
这将在seed
中维护已看到值的列表,并在再次看到时删除这些值。递归函数rec
关闭此值,因此所有子列表在每次调用多级列表删除重复项时共享一个seed
变量
(defun multi-level-list-remove-duplicates (tree)
(let ((seen NIL))
(labels ((rec (l)
(cond
((null l) NIL)
((consp (car l)) (cons (rec (car l))
(rec (cdr l))))
((member (car l) seen) (rec (cdr l)))
(T (push (car l) seen)
(cons (car l) (rec (cdr l)))))))
(rec tree))))