【问题标题】:Find cartesian product of 2 collections查找 2 个集合的笛卡尔积
【发布时间】:2014-12-09 10:35:03
【问题描述】:

我正在尝试在 clojure 中编写一个返回笛卡尔积的函数

(my-compute-fn [1 2 3] [4 5 6]) 

会回来

[[1 4] [1 5] [1 6] [2 4] [2 5] ....]

我的尝试导致了这个

(defn compute [col1 col2]
    (let [totcol2 (count col2)
          totcol1 (count col2)]
         (map #(vector %1 %2)
               (mapcat #(repeat totcol1 %1) col1)
               (take (* totcol1 totcol2) (cycle col2)))))

它可以完成这项工作,但看起来有点笨重。 什么是更好、更简洁的实现,涉及 clojure.core 中更容易获得的功能?

谢谢!

编辑: 找到了 clojure 组合学,似乎没有神奇的函数方式可以做到这一点。

【问题讨论】:

标签: map clojure


【解决方案1】:

for 是这项任务的主要候选人:

(for [a [1 2 3]
      b [4 5 6]]
  [a b])
;; => ([1 4] [1 5] [1 6] [2 4] [2 5] [2 6] [3 4] [3 5] [3 6])

您可以为for 提供任意数量的seq,它会将给定的符号绑定到与其关联的seq 的每个元素。还有更酷的东西,比如:when,可以让你例如找出总和为 7 的所有产品:

(for [a [1 2 3]
      b [4 5 6]
      :when (= (+ a b) 7)]
  [a b])
;; => ([1 6] [2 5] [3 4])

【讨论】:

  • 看起来相当优雅和简单!谢谢!
猜你喜欢
  • 2020-07-05
  • 2012-09-07
  • 2015-01-28
  • 2018-09-28
  • 2021-05-09
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
相关资源
最近更新 更多