2016-11-04 15 views
0

該方法的基本前提是參數數組採用多維數組並繞着矩陣順時針將所有值順序推入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

問題在於,在第二次迭代中,arrayarr << array.shift後變爲空,所以接下來的兩行在空數組上執行。您看到的錯誤是因爲該方法的第八行上的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]

+0

啊啊我以爲循環打破時array.flatten.empty?足以防止空陣列。所以在循環中斷之前返回nil?無論如何,它工作。謝謝! –

+0

'array.flatten.empy?'break是可以的,但是數組可以在任何一步變空,而不一定在最後一步之後。另外,請注意我剛剛完成的編輯...算法存在一個小問題。 – SteveTurczyn

+0

啊,是啊,我注意到昨天晚上我寫了一些更多的測試,非常感謝。我從來沒有意識到,它只檢查所有步驟完成後數組是否爲空。我認爲這是合乎邏輯的。 –