使用clojure将具有不共同元素的序列返回到两个原始序列

Xiu*_* Xu 3 tail-recursion clojure

我有两个序列,可以是矢量或列表.现在我想返回一个序列,其元素与两个序列不相同.

这是一个例子:

(removedupl [1 2 3 4] [2 4 5 6]) = [1 3 5 6]
(removeddpl [] [1 2 3 4]) = [1 2 3 4]
Run Code Online (Sandbox Code Playgroud)

我现在很困惑.这是我的代码:

(defn remove-dupl [seq1 seq2]
    (loop [a seq1 b seq2]
        (if (not= (first a) (first b))
            (recur a (rest b)))))
Run Code Online (Sandbox Code Playgroud)

但我不知道接下来该做什么.

Tim*_*ley 6

我鼓励你在集合操作方面考虑这个问题

(defn extrasection [& ss]
  (clojure.set/difference
    (apply clojure.set/union ss)
    (apply clojure.set/intersection ss)))
Run Code Online (Sandbox Code Playgroud)

这样的表述假定输入是集合.

(extrasection #{1 2 3 4} #{2 4 5 6})
=> #{1 6 3 5}
Run Code Online (Sandbox Code Playgroud)

通过在列表,序列或向量上调用(set ...)函数可以轻松实现这一点.

即使您更喜欢坚持使用面向序列的解决方案,请记住,如果您扫描两个序列[除非它们已排序],搜索这两个序列都是O(n*n)任务.可以在一次传递中构建集合,并且查找非常快.检查重复项是使用集合的O(nlogn)任务.