我在我的小递归方法中收到了nil值

时间:2016-11-04 01:21:14

标签: ruby recursion multidimensional-array null

该方法的基本前提是参数数组采用多维数组并绕矩阵顺时针方向将所有值推入arr并将它们作为整数列表返回。

但是,我似乎收到了这个错误:

 `block in snail': undefined method `reverse' for nil:NilClass (NoMethodError)

这是我的方法:

def snail(array)

arr = []
 loop do
    return arr.flatten if array.empty?
    arr << array.shift
    array.map {|row| arr << row.pop}
    arr << array.pop.reverse
    array.map {|row| arr << row.shift}

  end

end

这是测试论点:

[[1,2,3],[4,5,6],[7,8,9]

这是我在编辑第5行时得到的输出:

line 5: arr << unless NilClass then array.pop.reverse end
output: [1, 2, 3, 6, 9, nil, 4, 7, 5, 8, nil, nil]

预期回报:

[1, 2, 3, 6, 9, 8, 7, 4, 5]

为什么会出现这些零值?

1 个答案:

答案 0 :(得分:1)

问题在于,在第二次迭代中,arr << array.shiftarray.pop之后变为空,因此接下来的两行在空数组上执行。您看到的错误是因为方法第八行的nil没有任何内容,因此返回nil#reverse不支持array

您需要处理def snail(array) arr = [] until array.flatten.empty? arr << array.shift array.map {|row| arr << row.pop} unless array.flatten.empty? arr << array.pop.reverse unless array.flatten.empty? array.map {|row| arr << row.shift} unless array.flatten.empty? end return arr.flatten end 在任何阶段都可能耗尽,而不仅仅是在执行了所有四个操作之后。{/ p>

array.reverse.map {|row| arr << row.shift} unless array.flatten.empty?

顺便说一下......我认为左侧的蜗牛没有正确编码。你必须从下到上读取数字,所以,循环的最后一行应该是......

{{1}}

问题没有显示在您的测试参数上,但如果您尝试使用更大的矩阵,则会看到问题,例如

[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]]

你的方法给出...... [1,2,3,4,8,12,16,15,14,13,5,9,6,7,11,10]

但正确答案是...... [1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10]