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`
答案 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或更大的参数时,您将返回零。至少,您必须在外部循环中遍历每个子数组。那,或者你可以将它压缩成一个数组。
另外,正如我在评论中指出的那样,你的例程根本不是递归的。你有一个方法'递归',它在循环中调用另一个方法'遍历'。