组合的递归函数

时间:2016-06-11 02:23:57

标签: ruby algorithm recursion

我试图解决以下问题:

  

给定两个整数n和k,返回k的所有可能组合   数字超出1 ... n。

我在ruby中执行此操作并尝试实施此解决方案https://gist.github.com/safeng/8156755,但我的结果始终是为空

def combine(n, k)
    res = [[]]

    return res if k > n || n == 0

    sol = []
    comb(0, 0, k, n, sol, res)
    res
end

def comb(start, idx, k, n, sol, res)
  if idx == k
     res << sol
  else
    (start..n).to_a.each do |i|
      sol << (i + 1)
      comb(i + 1, idx + 1, k, n, sol, res)
      sol.pop
    end
  end
end

print combine(4, 2) #[[], [], [], [], [], [], [], [], [], [], []]

你有什么想法吗?

谢谢

注意(更新):

有效的代码:

def combine(n, k)
    res = []

    return res if k > n || n == 0

    sol = []
    comb(0, 0, k, n, sol, res)
    res
end

def comb(start, idx, k, n, sol, res)
  if idx == k
     res << sol.dup
  else
    (start..n - 1).to_a.each do |i|
      sol << (i + 1)
      comb(i + 1, idx + 1, k, n, sol, res)
      sol.pop
    end
  end
end

1 个答案:

答案 0 :(得分:2)

您的代码中存在一些错误:

combine初始化数组时,您不需要为res添加空数组:

res = []

当您将sol添加到res时,您应该复制它而不是推送引用,否则当您修改{res时,已添加到sol的解决方案将被修改1}}:

if idx == k
    res << sol.dup

最后,您只需要循环到n-1(因为您将i + 1推送到sol):

(start..n-1).to_a.each do |i|