2014-01-25 152 views
1

我需要在我的代碼中計算一個數組的笛卡爾積,其本身的次數可以變化。例如,如果我的數組是[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

您可能正在尋求與重複排列和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]] 
+0

謝謝!我以前沒有見過這個。 – Phrogz

0

因爲我喜歡的monkeypatching,我把這個數組本身:

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

我不知道是否有通過N-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]] 
+0

啊,我喜歡這一點遠遠超過' .times.map'。謝謝。 – Phrogz