2016-06-17 138 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] 

有人能解釋爲什麼我們需要的最後max_sub當我們在嵌套循環的max_sub = arr[i..x]?並且,功能inject([arr.first]) do |max_sub, i|紅寶石注入嵌套循環

回答

1

當然:該塊返回備忘對象的新值。也就是說,產生到塊的下一個值max_sub將是上一次返回的塊。

inject method of Enumerable用於將二元運算或任意塊(如果提供)應用於Enumerable

對於Enumerable的每個元素,inject將適用的操作或通過備忘錄對象和當前元素的塊。

備註對象是參數,或者如果缺失,則爲塊的第一個元素。它通常通過一個塊累積。塊的每個收益都會產生備忘錄的新值。然後返回備忘對象的最後一個值。

這是一種將數據結構減少爲彙總結果的結構化且潛在功能的方式。

Full docs here.

+1

我喜歡'each_with_object'了'正是inject'因爲我並不需要記住返回備忘錄的新價值:) –

+0

@DigitalRoss所以max_sub = ARR [i..x]會返回在(i ... arr.length)循環中.each do | x |。並且,最後一個max_sub會將值bac k返回到(0 ... arr.length).inject([arr.first])do | max_sub,i | ??我一直認爲價值將被分配,並返回自max_sub = arr [i..x] – paulsus

+0

@paulsus,在這一點上,如果你還有其他問題,你應該閱讀文檔。可以說,你應該在發佈之前做到這一點,哈哈。 – DigitalRoss