我需要在代码中计算数组的笛卡尔产品,其本身有不同的次数。例如,如果我的数组是[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]
最简单的方法是什么?
您可能正在寻找重复的置换,而来自标准库中的Ruby的Array
幸运地实现了这一点:
[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]]
答案的轻微变体:
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]]
因为我喜欢monkeyPatching,所以我将其放在数组本身上:
class Array
def **(n)
self.product( *(n-1).times.map{ self } )
end
end
我不确定是否有一种更优雅的方法可以通过 n-1