2014-03-27 150 views
0

在多级列表中删除重复(使用的Common Lisp)而不改变列表的内部结构中删除在多级列表重复。这个问题对我来说似乎是一个难题,也是一个令人头疼的问题。使用的Common Lisp

源列表: (1 2(6 5)2 3(5 4))==>结果:(1(6)2 3(5 4))

这是我的未工作的决定:

LispWokrs:

(defun定义F(升&可选(LST(删除-重复(弄平升))))

(cond 
    ((null l) nil) 

    ((atom (car l)) 

     (if (member (car l) lst) 
      (cons (car l) (F (cdr l) (remove (car l) lst))) 
      (F (cdr l) lst))) 

    (t (cons (F (car l) lst) (F (cdr l) lst))))) 

我试图使用LST用于保持一组清晰的(1 2 6 5 3 4),我已经b EEN试图从该组中的每个我添加新元素时删除元素。我得到的是几乎相同的源序列(并行递归...):

(f'(1 2(6 5)2 3(5 4)))==>(1 2(6 5 )3(5 4))

(F“(А((BCE)d(BEA))))==>(А((BCE)d(BEA)))

然后我搜索过网,但没有为这个问题的决定。

回答

1

试试这个:

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

这维持已经看到值的列表中seen,如果再看到删除这些。递归函数rec关闭在这个值,因此所有的子列表共享一个seen变量每次调用multi-level-list-remove-duplicates