Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 查找与数字对应的数字集_Ruby - Fatal编程技术网

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