2016-11-04 2 views
0

Die Grundvoraussetzung der Methode ist, dass das Argumentarray ein mehrdimensionales Array nimmt und um die Matrix im Uhrzeigersinn schiebt, alle Werte in arr drückt und sie als Liste von ganzen Zahlen zurückgibt.Ich erhalte Nullwerte in meiner kleinen Rekursionsmethode

Allerdings scheinen ich diesen Fehler zu empfangen:

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

Das ist meine Methode ist:

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 

Dies ist das Argument Test:

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

Dies ist der Ausgang Ich bekomme, wenn ich Zeile 5 zu diesem bearbeiten:

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

Erwarteter Ertrag:

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

Warum diese Null-Werte erscheinen?

Antwort

1

Das Problem ist, dass bei der zweiten Iteration array leer wird nach arr << array.shift, so dass die nächsten zwei Zeilen auf einem leeren Array ausgeführt werden. Der Fehler, den Sie sehen, liegt daran, dass array.pop in der achten Zeile der Methode nichts zu knacken hat und daher nil zurückgibt und nil#reverse nicht unterstützt.

Sie müssen damit umgehen array kann in jeder Phase erschöpft werden, nicht nur nachdem alle vier Operationen ausgeführt werden.

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 

Übrigens ... Ich denke, die Schnecke auf der linken Seite ist nicht korrekt codiert. Sie haben die Zahlen von unten lesen nach oben, so die letzte Zeile der Schleife sollte ...

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

Das Problem ist nicht auf Ihrem Test Argument nicht zeigen, aber Sie werden das Problem sehen, wenn Sie versuchen Sie eine größere Matrix, wie

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

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

Aber Richtige Antwort ist ... [1, 2, 3, 4, 8, 12, 16, 15, 14, 13, 9, 5, 6, 7, 11, 10]

+0

Ahh ich dachte die Schleife bricht wenn array.flatten.lepty? war genug, um gegen ein leeres Array zu schützen. Also wird nil zurückgegeben, bevor die Schleife bricht? Es hat trotzdem funktioniert. Vielen Dank! –

+0

Der 'array.flatten.empy?' - Break ist in Ordnung, aber das Array könnte bei jedem Schritt leer werden, nicht unbedingt nach dem letzten Schritt von vier. Beachten Sie auch den Schnitt, den ich gerade gemacht habe ... es gibt ein Problem mit dem Algorithmus. – SteveTurczyn

+0

Ahh ja, das habe ich letzte Nacht bemerkt, als ich ein paar mehr Tests schrieb, vielen Dank. Ich habe nie bemerkt, dass es nur überprüft, ob die Arrays leer sind, nachdem alle Schritte abgeschlossen sind. Es macht logischen Sinn, nehme ich an. –

Verwandte Themen