ruby递归循环失败

时间:2009-11-08 07:50:45

标签: ruby

asdf = [[1,2,3],[11,22,33,44,55,66],[51]]

def recursive(params, index)
 if (index==params.size)
  puts "DONE"
 end

 currentParam = params[index]
 currentParam.each do |sh|
  puts sh
  recursive(params, index+1)
 end

end

recursive(asdf,0)

我期待输出如下:

1 11 22 33 44 55 66 51 的 2 11 22 33 44 55 66 51 3 11 22 33 44 55 66

相反,我得到:

1 11 51

并且:

nil的未定义方法'each':NilClass`

2 个答案:

答案 0 :(得分:3)

我看到的第一个问题是方法recursive实际上并不是递归的。我将假设对traverse的调用是为了递归。

第二个问题是index == params.size你实际上没有停止递归。你只是打印“完成”然后继续。这解释了零例外。

第三个问题是这种模式无论如何都与你的期望不符。你确定你打算成为1 11 22 33 44 55 66 51 2 11 ...而不是1 11 51 22 51 33 51 44 51 55 51 66 51 2 11 51 22 51 ......?后者是您的代码尝试执行的操作,实际上是您将puts "DONE"替换为return时获得的内容。

以下是编写方法的更优雅方式:

def recursive2(params)
  return if params.empty?
  params[0].each do |p|
    puts p
    recursive2(params[1..-1])
  end
end

recursive2(asdf)

答案 1 :(得分:0)

你有一个数组数组

asdf = [[1,2,3],[11,22,33,44,55,66],[51]]

数组asdf包含三个元素,每个元素都是一个数组。因此,当您索引索引为3或更大的参数时,您将返回零。至少,您必须在外部循环中遍历每个子数组。那,或者你可以将它压缩成一个数组。

另外,正如我在评论中指出的那样,你的例程根本不是递归的。你有一个方法'递归',它在循环中调用另一个方法'遍历'。