Ruby 查找与数字对应的数字集
从一个数字,我想生成不同的数字组,其中总和对应于这个数字 例如:Ruby 查找与数字对应的数字集,ruby,Ruby,从一个数字,我想生成不同的数字组,其中总和对应于这个数字 例如: generate_groups([], 1) would be equal to [ [1] ] generate_groups([], 2) would be equal to [ [1,1] , [2] ] generate_groups([], 3) would be equal to [ [1, 1, 1], [1, 2], [2, 1], [3] ] 我已经用迭代代码编写了解决方案,但递归代码有更好的答案 因此,我编写
generate_groups([], 1) would be equal to [ [1] ]
generate_groups([], 2) would be equal to [ [1,1] , [2] ]
generate_groups([], 3) would be equal to [ [1, 1, 1], [1, 2], [2, 1], [3] ]
我已经用迭代代码编写了解决方案,但递归代码有更好的答案
因此,我编写了以下代码:
def generate_groups(combo = [], rest)
return combo.flatten if rest <= 0
result = []
(1..rest).each do |number|
combo << number
tmp_res = generate_groups(combo, rest-number)
result << tmp_res
combo.pop
end
return result
end
我的算法出了什么问题?您的解决方案可以这样修复:
def generate_groups(combo = [], rest)
return [combo.dup] if rest <= 0 # no need for flattening
result = []
(1..rest).each do |number|
combo << number
tmp_res = generate_groups(combo, rest-number)
result += tmp_res # concat the solutions instead of nesting them.
combo.pop
end
return result
end
通过
注入
,我连接了中间结果数组。与您的算法无关,但可能有一个快速的ruby提示:如果您反转generate_groups的参数,那么第二个参数实际上是可选的(generate_groups(rest,combo=[])
),可以像generate_groups(1)一样调用或者生成组(1,[])
@TMP:这也很有效(因为Ruby 2,IIRC)。@undur\u gongor哦,好吧,这很酷,我不知道。但在我看来,在示例中指定空数组很奇怪
def generate_groups(combo = [], rest)
return [combo.dup] if rest <= 0 # no need for flattening
result = []
(1..rest).each do |number|
combo << number
tmp_res = generate_groups(combo, rest-number)
result += tmp_res # concat the solutions instead of nesting them.
combo.pop
end
return result
end
def generate_groups(rest)
return [[]] if rest <= 0
(1..rest).inject([]) do | a, number |
a + generate_groups(rest - number).map { | g | g << number }
end
end