List 使用Common Lisp删除多级列表中的重复项

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(

删除多级列表中的重复项(使用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)))

然后我在网上搜索,但没有解决这个问题的决定。

试试这个:

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