如何从 Clojure 中的嵌套 for 循环生成一个惰性序列
How to generate one lazy sequence from a nested for loop in Clojure
这是一个关于如何从 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
循环中收集结果,我需要它来解决更复杂的问题。
假设您使用嵌套for循环,apply concat
是preferred 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])
总是可取的,除非内循环依赖于外循环。
不要嵌套两个循环,而是使用带有两个迭代器的一个循环:
(for [i (range 1 4)
j (range i)]
[i j])
这是一个关于如何从 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
循环中收集结果,我需要它来解决更复杂的问题。
假设您使用嵌套for循环,apply concat
是preferred 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])
不要嵌套两个循环,而是使用带有两个迭代器的一个循环:
(for [i (range 1 4)
j (range i)]
[i j])