如何在Clojure中从嵌套for循环生成一个惰性序列

时间:2016-01-31 22:38:12

标签: for-loop clojure lazy-sequences

这是一个关于如何从Clojure中的嵌套for循环中正确收集结果的问题。假设您要创建所有向量[i j]的序列,其中0<=j<i<4

以下代码

(for [i (range 1 4)] 
  (for [j (range i)] 
     [i j]
  )
)

产生

(([1 0]) ([2 0] [2 1]) ([3 0] [3 1] [3 2]))

但我真正想要的是

([1 0] [2 0] [2 1] [3 0] [3 1] [3 2])

这样做的正确方法是什么?

请注意,我对这个特定的序列不感兴趣。我的目的是学习如何从嵌套的for循环中收集结果,这是我需要解决更复杂的问题。

2 个答案:

答案 0 :(得分:5)

不要嵌套两个循环,而是使用一个循环和两个迭代器:

(for [i (range 1 4)
      j (range i)] 
   [i j])

答案 1 :(得分:3)

假设你使用嵌套for循环,apply concatpreferred way to flatten a sequence by one level

=> (apply concat 
         (for [i (range 1 4)] 
           (for [j (range i)] 
             [i j])))

([1 0] [2 0] [2 1] [3 0] [3 1] [3 2])
除非内循环依赖于外循环,否则

@Oin's solution总是更可取。