2014-03-27 144 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