我如何在 Clojure 中迭代两个 Set 以 return 它们的笛卡尔积?
How do I iterate through two Sets in Clojure in order to return their Cartesian product?
所以我接受了两个集合并想遍历它们以便 return 一个包含两个集合的叉积的新集合。
(defn cartesian
"computes Cartesian product of A and B"
[A B]
use "set", "for")
我是 Clojure 的新手,所以我不确定为什么要使用“set, for”。
但是 A 和 B 将是集合。现在我想遍历每一个和 return 它们的笛卡尔积。示例:
(cartesian #{1 2} #{3 4 5}) => #{[1 3] [1 4] [1 5] [2 3] [2 4] [2 5]}
虽然我不确定到达那里的步骤。我查看了文档等,但找不到我要找的东西。此处理的其他答案与列表等有关。但我必须使用 2 套。
我正在看的 atm 正在使用 doseq[e A]
并在其中 doseq[x B]
然后将每个向量对 [e x]
添加到一个新集合,然后 return 它.不过,这似乎不是标准的功能解决方案。我在正确的轨道上吗?如何将它添加到新的集合中?
您可以使用 for
:
(defn cartesian [A B]
(set (for [a A
b B]
[a b])))
(cartesian #{1 2} #{3 4 5})
;; => #{[2 3] [2 5] [1 4] [1 3] [1 5] [2 4]}
使用cartesian-product from clojure.math.combinatorics. To get exact result you want (set of vectors), use into
with map
换能器:
(into #{} (map vec) (clojure.math.combinatorics/cartesian-product #{1 2} #{3 4 5}))
=> #{[2 3] [2 5] [1 4] [1 3] [1 5] [2 4]}
所以我接受了两个集合并想遍历它们以便 return 一个包含两个集合的叉积的新集合。
(defn cartesian
"computes Cartesian product of A and B"
[A B]
use "set", "for")
我是 Clojure 的新手,所以我不确定为什么要使用“set, for”。 但是 A 和 B 将是集合。现在我想遍历每一个和 return 它们的笛卡尔积。示例:
(cartesian #{1 2} #{3 4 5}) => #{[1 3] [1 4] [1 5] [2 3] [2 4] [2 5]}
虽然我不确定到达那里的步骤。我查看了文档等,但找不到我要找的东西。此处理的其他答案与列表等有关。但我必须使用 2 套。
我正在看的 atm 正在使用 doseq[e A]
并在其中 doseq[x B]
然后将每个向量对 [e x]
添加到一个新集合,然后 return 它.不过,这似乎不是标准的功能解决方案。我在正确的轨道上吗?如何将它添加到新的集合中?
您可以使用 for
:
(defn cartesian [A B]
(set (for [a A
b B]
[a b])))
(cartesian #{1 2} #{3 4 5})
;; => #{[2 3] [2 5] [1 4] [1 3] [1 5] [2 4]}
使用cartesian-product from clojure.math.combinatorics. To get exact result you want (set of vectors), use into
with map
换能器:
(into #{} (map vec) (clojure.math.combinatorics/cartesian-product #{1 2} #{3 4 5}))
=> #{[2 3] [2 5] [1 4] [1 3] [1 5] [2 4]}