2016-06-17 19 views
-2
def max_subarr(arr) 
    start_index, end_index = 0, 
    (0...arr.length).inject([arr.first]) do |max_sub, i| 
    (i...arr.length).each do |x| 
     if max_sub.inject(:+) < arr[i..x].inject(:+) 
     max_sub = arr[i..x] 
     start_index, end_index = i, x 
     end 
    end 
    max_sub 
    end 
    return [start_index, end_index] 
end 

max_subarr([98, -99, 198, -2, 950]) # => [2,4] 

Könnte jemand erklären, warum wir die letzten max_sub müssen, wenn wir die max_sub = arr[i..x] in der verschachtelten Schleife haben? Und die Funktion inject([arr.first]) do |max_sub, i|Ruby-verschachtelte Schleife injiziert

Antwort

1

Sicher: Dieser Block gibt den neuen Wert für das Memo-Objekt zurück. Das heißt, der nächste Wert von , der an den Block zurückgegeben wird, ist, was auch immer dieser Block das letzte Mal zurückgegeben hat.

Und die inject method of Enumerable wird verwendet, um eine binäre Operation oder einen beliebigen Block, falls vorhanden, auf eine Enumerable anzuwenden.

Für jedes Element der Enumerable, inject den Betrieb anwenden oder den Memoobjekt und das aktuelle Element auf den Block übergeben.

Das Memo-Objekt ist entweder der Parameter oder, falls nicht vorhanden, das erste Element des Blocks. Es wird typischerweise über einen Block gesammelt. Jeder Ertrag zu dem Block führt zu einem neuen Wert des Memos. Der letzte Wert des Memo-Objekts wird zurückgegeben.

Es ist eine strukturierte und potenziell funktionale Möglichkeit, eine Datenstruktur zu einem Zusammenfassungsergebnis zu reduzieren.

Full docs here.

+1

Ich ziehe 'each_with_object' über' inject' gerade weil ich den neuen Wert von Memo nicht merken müssen zurückkehren :) –

+0

@DigitalRoss so max_sub = arr [i..x] zurückkehren würde in der Schleife von (i ... arr.length) .je do | x |. Und die letzte max_sub würde den Wert bak k zurückliefern auf (0 ... arr.length) .inject ([arr.first]) do | max_sub, i | ?? Ich dachte, der Wert würde zugewiesen und zurückkommen, da max_sub = arr [i..x] – paulsus

+0

@paulsus, an dieser Stelle, wenn Sie weitere Fragen haben, sollten Sie die Dokumente lesen. Wahrscheinlich hättest du das vor dem Posten tun sollen, lol. – DigitalRoss