是否可以根据条件更新 foldLeft 函数中的变量?
Is it possible to update a variable in foldLeft function based on a condition?
我正在尝试编写 scala 代码,它从给定数组的连续子数组中给出最大总和。例如,val arr= Array(-2, -3, 4, -1, -2, 1, 5, -3)
。在这个数组中,我需要获得最大的连续子数组总和,即 4+(-1)+(-2)+(1)+5 = 7。我编写了以下代码来获得这个结果。
scala> arr.foldLeft(0) { (currsum,newnum) => if((currsum+newnum)<0) 0 else { if(currsum<(currsum+newnum)) (currsum+newnum) else currsum }}
res5: Int = 10
但偏离实际结果,因为我无法在 counting/summation 继续时更新 maximum_so_far
值。由于我已经使用 foldLeft
来执行此功能,是否有可能仅当连续子数组元素的总和大于先前的 max_sum 时才更新 maximum_so_far
变量?
嗯,很明显,您必须沿着输入数据传播两个值才能进行此计算,就像您在命令式情况下需要做的那样:
arr.foldLeft((0,0)){
case ((maxSum, curSum), value) => {
val newSum = Math.max(0, curSum + value)
(Math.max(maxSum, newSum), newSum)
}
}._1
另一种方法是计算中间结果(如果需要,可以懒惰地计算)然后 select 最大值:
arr.toIterator.scanLeft(0){
case (curSum, value) =>
Math.max(0, curSum + value)
}.max
我正在尝试编写 scala 代码,它从给定数组的连续子数组中给出最大总和。例如,val arr= Array(-2, -3, 4, -1, -2, 1, 5, -3)
。在这个数组中,我需要获得最大的连续子数组总和,即 4+(-1)+(-2)+(1)+5 = 7。我编写了以下代码来获得这个结果。
scala> arr.foldLeft(0) { (currsum,newnum) => if((currsum+newnum)<0) 0 else { if(currsum<(currsum+newnum)) (currsum+newnum) else currsum }}
res5: Int = 10
但偏离实际结果,因为我无法在 counting/summation 继续时更新 maximum_so_far
值。由于我已经使用 foldLeft
来执行此功能,是否有可能仅当连续子数组元素的总和大于先前的 max_sum 时才更新 maximum_so_far
变量?
嗯,很明显,您必须沿着输入数据传播两个值才能进行此计算,就像您在命令式情况下需要做的那样:
arr.foldLeft((0,0)){
case ((maxSum, curSum), value) => {
val newSum = Math.max(0, curSum + value)
(Math.max(maxSum, newSum), newSum)
}
}._1
另一种方法是计算中间结果(如果需要,可以懒惰地计算)然后 select 最大值:
arr.toIterator.scanLeft(0){
case (curSum, value) =>
Math.max(0, curSum + value)
}.max