2014-02-27 41 views
5

給定一個數組a,實現其組合達到n的最佳方法是什麼?例如:組合達到n

a = %i[a b c] 
n = 2 

# Expected => [[], [:a], [:b], [:c], [:a, b], [:b, :c], [:c, :a]] 
+0

你想要組合進行排序?你期望什麼樣的價值?一個大小如何? –

+0

@IvayloStrandjev不,它可以從最長的一個開始,也可以以任何順序開始。 – sawa

+1

不錯的問題.. +1我喜歡它...... :-) –

回答

8

做如下:

a = %w[a b c] 
n = 3 

0.upto(n).flat_map { |i| a.combination(i).to_a } 
# => [[], ["a"], ["b"], ["c"], ["a", "b"], 
# ["a", "c"], ["b", "c"], ["a", "b", "c"]] 
+0

@sawa感謝您的補充...... :-) –

2

另一種方式:

def all_combis(a, n, b=[]) 
    n.zero? ? b.unshift([]) : all_combis(a, n-1, b.unshift(*a.combination(n))) 
end 

all_combis(%i[a b c], 0) 
    #=> [[]] 
all_combis(%i[a b c], 1) 
    #=> [[], [:a], [:b], [:c]] 
all_combis(%i[a b c], 2) 
    #=> [[], [:a], [:b], [:c], [:a, :b], [:a, :c], [:b, :c]] 
all_combis(%i[a b c], 3) 
    #=> [[], [:a], [:b], [:c], [:a, :b], [:a, :c], [:b, :c], [:a, :b, :c]] 

如果秩序和效率是不重要的,這也適用:

a.repeated_combination(n).map(&:uniq) << [] 

%i[a b c].repeated_combination(2).map(&:uniq) << [] 
    #=> [[:a], [:a, :b], [:a, :c], [:b], [:b, :c], [:c], []] 
+0

+1幫助我記住'repeated_combination' .. **遞歸**技術也不錯。 –