Clojure 潜在无限序列的第一公共元

Clojure 潜在无限序列的第一公共元,clojure,lazy-evaluation,Clojure,Lazy Evaluation,我编写了代码来查找许多序列的公共元素: (defn common [l & others] (if (= 1 (count others)) (filter #(some #{%1} (first others)) l) (filter #(and (some #{%1} (first others)) (not (empty? (apply common (list %1) (rest others))))) l))) 可以找到有限序列的第一个公共元素,如下所

我编写了代码来查找许多序列的公共元素:

(defn common [l & others]
  (if (= 1 (count others)) 
    (filter #(some #{%1} (first others)) l) 
    (filter #(and (some #{%1} (first others)) (not (empty? (apply common (list %1) (rest others))))) l)))
可以找到有限序列的第一个公共元素,如下所示:

(第一(普通[12][0112345][31])) ->一,

但是,如果任何序列是无限的,则它很容易通过无限搜索发送:

(第一(普通[12][0112345](范围)))

我理解为什么会发生这种情况,我知道我需要以某种方式使计算变得懒惰,但我还不知道如何最好地做到这一点


这就是我的问题:如何重新编写此代码(或者使用完全不同的代码)以找到多个序列的第一个公共元素,其中一个或多个序列可能是无限的。

如果序列的内容没有其他约束,这是不可能的。例如,如果要求它们按顺序排序,您可以这样做。但给定两个无限的、任意顺序的序列A和序列B,您永远无法确定A[0]不在B中,因为您将永远保持搜索,因此您永远无法开始搜索A[1]。

如果没有对序列内容的其他约束,这是不可能的。例如,如果要求它们按顺序排序,您可以这样做。但给定两个无限的、任意顺序的序列A和序列B,你永远无法确定A[0]不在B中,因为你会一直搜索,所以你永远无法开始搜索A[1]。

我可能会这样做

(fn [ & lists ]
    (filter search-in-finite-lists (map (fn [ & elements ] elements) lists)))
诀窍是一次在所有列表中逐级搜索。在每个级别,您只需要在每个列表的最后一个元素位于任何其他列表中时进行搜索

我猜如果列表是无限的,并且没有匹配项,那么它会无限搜索。但是,您可以在过滤器之前添加一个(take X list),以施加最大值。像这样:

(fn [ max & lists ]
    (filter search-in-finite-lists (take max (map (fn [ & elements ] elements) lists))))

好吧,这仍然是假设有限数量的列表。。。这应该是合理的。

我可能会这样做

(fn [ & lists ]
    (filter search-in-finite-lists (map (fn [ & elements ] elements) lists)))
诀窍是一次在所有列表中逐级搜索。在每个级别,您只需要在每个列表的最后一个元素位于任何其他列表中时进行搜索

我猜如果列表是无限的,并且没有匹配项,那么它会无限搜索。但是,您可以在过滤器之前添加一个(take X list),以施加最大值。像这样:

(fn [ max & lists ]
    (filter search-in-finite-lists (take max (map (fn [ & elements ] elements) lists))))

好吧,这仍然是假设有限数量的列表。。。这应该是合理的。

事实上,现在你说出来就很明显了!因此,如果seq被排序,我可以在下一个值大于A[0]时中止对B的搜索,对吗?对。在这个话题上,实际上有一个很好的答案;如果你不介意一个扰流器,看看。事实上,现在你说出来就很明显了!因此,如果seq被排序,我可以在下一个值大于A[0]时中止对B的搜索,对吗?对。在这个话题上,实际上有一个很好的答案;如果你不介意一个扰流器,看看。