2017-03-13 9 views
1

私は、ナップザック問題のように、任意の入力数のすべての組み合わせを繰り返したいと思っています。Rubyでは、任意の数の配列に対してどのように反復処理を行うことができますか?

たとえば、私の関数が3つの配列を取る場合、すべてのi×j×kの組み合わせを取得したいと思います。私の関数が5つの配列を取る場合、私はすべてのi×j×k×l×mの組み合わせを得たいです。

例1:

result = all_products([1,2,3,4,5], [1,2,3], [10,20,30,40,50,60,70,80]) 

result.length == 120 

例2:

result = all_products([1,2,3], [1,2,3], [1,2,3], [1,2,3], [1,2,3], [1,2,3]) 

result.length == 729 

しかし、私は私が取るつもりですどのように多くの配列がわからない

これを行う方法は何Rubyで?

これは、ではありません。は、1つの配列のすべてのペアの検索方法を尋ねています。私の入力配列はおそらくすべて異なっているでしょう。ここで

は、私がこれまで試したものです:

def self.all_combinations(*sets) 
input = *sets; 
prod = sets.inject(1) { |p,a| p * a.length } 
prod.times do |p| 
    args = [] 
    index = p 
    input.each do |array| 
    quotient = index/array.length 
    remainder = index % array.length 
    args << array[remainder] 
    index = quotient 
    pp args 
    end 
end 
+0

詐欺ではありません。質問をお読みください。 –

+0

あなたはこれまでに何を試しましたか?あなたは小さなサンプル配列と予想される出力を与えることができますか? – whodini9

+0

任意の数のargに対してスプラット演算子でargsを渡します 'all_products(* products)'これは配列の配列として 'products'にそれらを代入します。その後、デカルト製品をどのように把握する必要があります。 –

答えて

0

私は2つの配列の「製品」を取得してから始めます:

def product2(array1, array2) 
    array1.map { |e1| array2.map { |e2| e1*e2 } }.flatten 
end 

あなたは、その後の配列の任意の数に一般化することができます:

def all_products(*arrays) 
    arrays.reduce([1]) { |result, array| product2(result, array) } 
end 

コーナーケースを処理することができます(空の配列や入力配列はまったくありません)

関連する問題