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|
答案 0 :(得分:1)
确定:该块返回备忘录对象的新值。也就是说,产生于块的max_sub
的下一个值将是上次返回的块。
inject method of Enumerable
用于将二进制操作或任意块(如果提供)应用于Enumerable
。
对于Enumerable
的每个元素,inject
将应用操作或将备忘录对象和当前元素传递给块。
备忘录对象是参数,如果不存在,则是块的第一个元素。它通常通过块累积。块的每个产量都会产生备忘录的新值。然后返回备忘录对象的最后一个值。
这是一种将数据结构简化为汇总结果的结构化且可能具有功能的方法。