首先,您需要了解是什么foldLeft
。这个函数的意思是通过传递组合操作和初始元素将集合折叠成单个值:
// Think of applying op(op(op(…), z) from left to right:
def foldLeft[B](z: B)(op: (B, A) ⇒ B): B
现在,让我们看看你的foldLeft
. 首先,0 -> 0
通过。这意味着B
初始元素的类型是一个(Int, Int)
值为的元组(0, 0)
。
其次,左括号定义了一个函数。在 scala 中,您可以使用花括号传递它。(B, A)
因此,在我们的例子中,函数需要参数类型B
是元组(Int, Int)
,类型A
是数组元素的类型,即Int
.
因此,当您可以像这样翻译代码时:
someArray.foldLeft(0 -> 0) {
(tuple: (Int, Int), element: Int) => //the body
}
现在,在 Scala 中,您可以case
通过应用提供的模式来创建带有关键字的部分函数。在我们的例子中,模式通过将变量maxUpToHere
和绑定maxSoFar
到元组元素和数组元素来匹配提供的参数n
。
因此,该函数将从数组中获取每个元素,将其与提供的元组一起应用,并将其传递给下一个应用程序,直到数组被完全处理。现在,让我们看看函数体中发生了什么:
val maxEndingHere = 0 max maxUpToHere + n
maxEndingHere -> (maxEndingHere max maxSoFar)
请记住,我们的函数应该返回 nextB
以申请使用数组中的元素进行调用。在我们的B
例子中是一个元组。因此,想法是将序列的整体最大值和局部最大值存储在一个元组中。
取上一次计算与数组当前元素的maxEndingHere
中间max
值和总和。如果当前元素为负数,它将减少最大序列,从而产生最大比较结果,从而重置累加值。0
n
0
然后,我们只需使用新计算的序列总和maxEndingHere
以及当前值与目前计算的值之间的最大值创建新元组(因此命名为maxSoFar
)。
最后,我们只需通过调用来获取计算元组的第二个值._2
。