代码之家  ›  专栏  ›  技术社区  ›  Blaine Lafreniere

如何将一个集合中的所有元素与另一个集合中的所有元素相乘?

  •  14
  • Blaine Lafreniere  · 技术社区  · 15 年前

    (def s1 [1 2 3 4 5])
    (def s2 [1 2 3 4 5])
    

    x 在里面 s1 y 在里面 s2 .


    澄清一下,我基本上想要笛卡尔积,所以我不认为 map 在这里工作。

    5 回复  |  直到 15 年前
        1
  •  25
  •   Michał Marczyk    15 年前
    (for [x1 s1
          x2 s2]
      (* x1 x2))
    
        2
  •  4
  •   Dimagog    15 年前

    使用解决方案时 好一点,这里有一个 -只有当你有困难理解 对于 :

    (map #(map (partial * %) s2) s1)
    

    上面的扩展与此类似,只是它将使用另一个匿名函数而不是 部分

    (map (fn [x] (map (fn [y] (* x y)) s2)) s1)
    

    或者,格式整齐:

    (map
      (fn [x]
        (map
          (fn [y]
            (* x y))
          s2))
      s1)
    
        3
  •  2
  •   dbyrne    15 年前

    以下是java 1.5(或更新版本)与Michal代码的等价物:

    List<Integer> numbers = new ArrayList<Integer>();    
    
    for(int x1 : s1) {
      for(int x2 : s2) {
        numbers.add(x1 * x2);
      }
    }
    

    for java中的循环不像clojure中那样返回序列,因此需要使用可变的 ArrayList 构造结果。

        4
  •  2
  •   Alex Taggart    15 年前

    简单、直观地演示 for :

    user=> (pprint 
             (for [tens (range 10) 
                   ones (range 10)]
               [tens ones]))
    ([0 0]
     [0 1]
     [0 2]
     [0 3]
     [0 4]
     [0 5]
     [0 6]
     [0 7]
     [0 8]
     [0 9]
     [1 0]
     [1 1]
     [1 2]
     [1 3]
     [1 4]
     [1 5]
     [1 6]
     [1 7]
     [1 8]
     [1 9]
     [2 0]
     [2 1]
     [2 2]
     [2 3]
     [2 4]
     [2 5]
     [2 6]
     [2 7]
     [2 8]
     [2 9]
     [3 0]
     [3 1]
     [3 2]
     [3 3]
     [3 4]
     [3 5]
     [3 6]
     [3 7]
     [3 8]
     [3 9]
     [4 0]
     [4 1]
     [4 2]
     [4 3]
     [4 4]
     [4 5]
     [4 6]
     [4 7]
     [4 8]
     [4 9]
     [5 0]
     [5 1]
     [5 2]
     [5 3]
     [5 4]
     [5 5]
     [5 6]
     [5 7]
     [5 8]
     [5 9]
     [6 0]
     [6 1]
     [6 2]
     [6 3]
     [6 4]
     [6 5]
     [6 6]
     [6 7]
     [6 8]
     [6 9]
     [7 0]
     [7 1]
     [7 2]
     [7 3]
     [7 4]
     [7 5]
     [7 6]
     [7 7]
     [7 8]
     [7 9]
     [8 0]
     [8 1]
     [8 2]
     [8 3]
     [8 4]
     [8 5]
     [8 6]
     [8 7]
     [8 8]
     [8 9]
     [9 0]
     [9 1]
     [9 2]
     [9 3]
     [9 4]
     [9 5]
     [9 6]
     [9 7]
     [9 8]
     [9 9])
    
        5
  •  1
  •   Jawher    15 年前

    尽可能简单:

    (map * '(1 2) '(3 4))
    

    将产生:

    (3 8)
    
    推荐文章