2016-06-23 13 views
0

Ich habe mich in den letzten Monaten selbst programmieren Programmierung und ich bin endlich auf Rekursion. Im Moment soll ich rekursiv Mergesort implementieren. Ich habe recherchiert und verstanden, was passieren soll, aber ich habe einige Probleme mit meinem Code. An dieser Stelle möchte ich nicht nur die Antwort nachschlagen, weil ich mehr daran interessiert bin herauszufinden, was ich falsch mache, als nur die Antwort zu haben. Ich halte einen Fehler keine Methode bekommenImplementieren von Mergesort in Ruby rekursiv

nicht definierte Methode `sagen>‘ für [6]: Array

Mein Code im Moment so ist:

def merge_sort(arr) 
    n = arr.length 
    p = n/2 
    q = p - 1 
    return arr if n == 1 

    l1 = arr[0..q] 
    l2 = arr[p..n] 

    l1 = merge_sort(l1) 
    l2 = merge_sort(l2) 

    return merge(l1, l2) 
end 

def merge(arr_1, arr_2) 
    arr_3 = [] 
    while !arr_1.empty? && !arr_2.empty? 
    if arr_1[0] > arr_2[0] 
     arr_3 << arr_2[0] 
     arr_2.delete_at(0) 
    else 
     arr_3 << arr_1[0] 
     arr_1.delete_at(0) 
    end 
    end 

    if arr_1.length == 0 
    arr_3 << arr_2[0..-1] 
    elsif arr_2.length == 0 
    arr_3 << arr_1[0..-1] 
    end 

    arr_3 
end 

puts merge_sort([2, 6, 4, 5, 7, 9, 8, 3]) 
+0

Ich vermute, der Fehler zeigt auf 'wenn arr_1 [0]> arr_2 [0]'. Versuchen Sie es mit dem Juwel 'hebeln 'zu debuggen. Am Anfang des Dokuments "require" pry', dann direkt vor dieser Zeile "binding.pry" hinzufügen und vom Terminal laufen. Sie können dann 'arr_1' und' arr_2' eingeben, um die Werte dieser Variablen zu sehen. –

+1

Formatieren Sie den Code mit 2-Punkt-Einrückungen, um ihn lesbar zu machen. Vielen Dank. – mudasobwa

+0

Danke für Ihre Antwort. Ich hatte etwas Ähnliches versucht, indem ich p arr_1 sowie p arr_1 [0] vor der while-Schleife und 6 als Fixnum und nicht als Array zurücklegte, aber ich werde versuchen, was Sie auch vorgeschlagen haben! –

Antwort

0

Ihr arr_3 enthält Array von Arrays. Sie müssen es in der letzten Zeile der merge Methode

arr_3.flatten 

Auch abzuflachen, würde ich empfehlen, Variablennamen zu verwenden, die Methoden zu verstehen hilft. Sie sollten auch verschiedene Methoden betrachten, die Array Klasse zu bieten hat, da einige davon nützlich sein können, um prägnanten Code zu schreiben. Zum Beispiel ist unten ein Versuch, Ihre merge Methode neu zu schreiben, die die Logik behält, die gleich ist, wie Sie haben. Hier vermieden wir arr_3 werden Array von Array immer unter Verwendung Array#concat Methode

def merge(left, right) 

    merged_array = [] 
    while !left.empty? && !right.empty? 
    if left.first > right.first 
     merged_array << right.shift 
    else 
     merged_array << left.shift 
    end 
    end 

    if left.empty? 
    merged_array.concat right 
    else 
    merged_array.concat left 
    end 

    merged_array 
end