2016-06-17 94 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