2016-11-04 3 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] 

は、なぜこれらのnilの値が表示されていますか?

答えて

1

問題は、arrayarr << array.shiftの後で空になり、次の2行が空の配列で実行されていることです。表示されているエラーは、メソッドの8行目のarray.popがポップすることがないため、nilを返し、nil#reverseを返します。

arrayは、4つの操作がすべて実行された後だけでなく、どの段階でも使い果たされるようにする必要があります。

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? 'のブレークはOKですが、配列はすべてのステップで空になる可能性があります。必ずしも4の最後のステップの後である必要はありません。また、ちょうど私が行った編集に注意してください...アルゴリズムに若干の問題があります。 – SteveTurczyn

+0

ええ、昨晩私がもう少し多くのテストを書いてくれたことに感謝しました。私は、すべてのステップが完了した後に配列が空であるかどうかをチェックするだけであることは決して理解しませんでした。それは私が推測する論理的な意味があります。 –

関連する問題