组合到n

时间:2014-02-27 12:03:00

标签: ruby arrays combinations

给定数组a,实现n之间组合的最佳方法是什么?例如:

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

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

2 个答案:

答案 0 :(得分: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"]]

答案 1 :(得分: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], []]