在惰性集合中查找重复值的惯用方法是什么,从检查中排除某些值?
喜欢:
(duplicates? '(1 2 3 4 1) '(1)) ;; 1 is excluded from the check
false
(duplicates? '(1 2 3 4 1) ()) ;; no exclusions
true
我的要求是代码应该能够处理无限列表。换句话说,如果可以通过查看第一个N
元素来说明可重复性,则代码不应该处理整个惰性集合。
我可怕的混乱尝试是:
(defn duplicates? [coll except]
(let [_duplicates? (fn [coll except accum]
(let [item (first coll)]
(if (nil? item)
false
(if (some #{item} except)
(recur (rest coll) except accum)
(if (some #{item} accum)
true
(recur (rest coll) except (conj accum item)))))))]
(_duplicates? coll except ())))