笛卡尔幂(自相矛盾的笛卡尔积)

时间:2014-01-25 05:34:18

标签: ruby cartesian-product

我需要在我的代码中计算一个数组的笛卡尔积,其自身的次数不同。例如,如果我的数组是[1,2]并且我需要将这些值填充到三个槽中,结果将是:

[1,1,1]
[1,1,2]
[1,2,1]
[1,2,2]
[2,1,1]
[2,1,2]
[2,2,1]
[2,2,2]

最简单的方法是什么?

3 个答案:

答案 0 :(得分:3)

你可能正在寻找重复的排列和标准库中的Ruby Array幸运implements this

[1,2].repeated_permutation(3).to_a
# [[1, 1, 1], [1, 1, 2], [1, 2, 1], [1, 2, 2], [2, 1, 1], [2, 1, 2], [2, 2, 1], [2, 2, 2]]

答案 1 :(得分:2)

答案的一个略微变体:

class Array
  def **(n)
    product( *([self]*(n-1)) )
  end
end

[1,2]**3
  # => [[1, 1, 1], [1, 1, 2], [1, 2, 1], [1, 2, 2],
  #     [2, 1, 1], [2, 1, 2], [2, 2, 1], [2, 2, 2]] 

答案 2 :(得分:0)

因为我喜欢monkeypatching,我把它放在数组本身上:

class Array
  def **(n)
    self.product( *(n-1).times.map{ self } )
  end
end

我不确定是否有一种更优雅的方法可以将 n-1 副本传递给该方法。