【问题标题】:I am receiving nil values in my small recursion method我在我的小递归方法中收到 nil 值
【发布时间】:2017-03-17 18:27:52
【问题描述】:

该方法的基本前提是参数数组采用多维数组并顺时针绕矩阵蛇行将所有值推入 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]

为什么会出现这些 nil 值?

【问题讨论】:

    标签: ruby recursion multidimensional-array null


    【解决方案1】:

    问题在于,在您的第二次迭代中,arrayarr &lt;&lt; array.shift 之后变为空,因此接下来的两行将在一个空数组上执行。您看到的错误是因为该方法第 8 行的 array.pop 没有可弹出的内容,因此返回 nilnil 不支持 #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
    

    顺便说一句...我认为左侧返回的蜗牛编码不正确。您必须从下到上读取数字,因此,循环的最后一行应该是...

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

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

    [[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]

    【讨论】:

    • 啊,我认为当 array.flatten.empty 时循环中断?足以防止空数组。所以在循环中断之前返回 nil ?无论如何它都奏效了。谢谢!
    • array.flatten.empy? 中断是可以的,但数组可能在任何一步变为空,不一定在四步的最后一步之后。另外,请注意我刚刚完成的编辑......算法存在一个小问题。
    • 啊,是的,我注意到昨晚我写了几个测试,非常感谢。我从来没有意识到它只会在所有步骤完成后检查数组是否为空。我想这是合乎逻辑的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多