LISP - 从给定的原子列表中删除重复项

时间:2018-01-08 01:14:54

标签: lisp common-lisp

我正在尝试删除给定列表中重复出现的原子。
我的代码如下 -

(defun combine (item List)
 (if (member item List)
   List (cons item List)))

(defuneliminateDuplicates(L)
    (do
      ((M L) M)
      ((null L) M)
      (setq M (combine (car L) M))
      (setq L (cdr L))
))

此代码工作正常,它会从列表中删除重复项 -

[3]> (eliminateduplicates '(a b b c a c g a))
(G C B A)
[4]> (eliminateduplicates '(a a a a a a))
(A)
[5]> (eliminateduplicates '(a b c d))
(D C B A)

在这里,我希望结果与给定列表中的结果顺序相同 即,(eliminateduplicates '(a b b c a c g a))的结果应为(B C G A),而不是(G C B A)的结果 我怎样才能做到这一点?感谢。

1 个答案:

答案 0 :(得分:3)

我建议使用不同的方法,它更简单,结果如预期的那样:

(defun eliminateDuplicates (L)
  (cond ((null L) L)
        ((member (car L) (cdr L))
         (eliminateDuplicates (cdr L)))
        (t (cons (car L) (eliminateDuplicates (cdr L))))))

例如:

(eliminateDuplicates '(a b b c a c g a))
=> (B C G A)