gpt4 book ai didi

scala - 累积结果,直到以功能方式满足某些条件

转载 作者:行者123 更新时间:2023-12-02 00:03:30 25 4
gpt4 key购买 nike

我在一个循环中进行了一些昂贵的计算,我需要找到计算产生的最大值,但如果它等于 LIMIT,我想停止计算并返回我的累加器。

可以通过递归轻松完成:

val list: List[Int] = ???
val UpperBound = ???

def findMax(ls: List[Int], max: Int): Int = ls match {
case h :: rest =>
val v = expensiveComputation(h)
if (v == UpperBound) v
else findMax(rest, math.max(max, v))

case _ => max
}

findMax(list, 0)

我的问题:这个行为模板是否有名字并反射(reflect)在scala集合库中?

更新:Do something up to N times or until condition is met in Scala - 有一个有趣的想法(使用懒惰并在最后查找或存在)但它不能直接适用于我的特定情况或需要可变变量来跟踪累加器。

最佳答案

我认为你的递归函数非常好,所以说实话我不会改变它,但这里有一种使用集合库的方法:

list.foldLeft(0) {
case (max, next) =>
if(max == UpperBound)
max
else
math.max(expensiveComputation(next), max)
}

它将遍历整个列表,但在达到上限后,它不会执行昂贵的计算。

更新

根据您的评论,我尝试根据 LinearSeqOptimized 的 foldLeft 实现对 foldLeft 进行一些调整。

def foldLeftWithExit[A, B](list: Seq[A])(z: B)(exit: B => Boolean)(f: (B, A) => B): B = {
var acc = z
var remaining = list
while (!remaining.isEmpty && !exit(acc)) {
acc = f(acc, list.head)
remaining = remaining.tail
}
acc
}

调用它:

foldLeftWithExit(list)(0)(UpperBound==){
case (max, next) => math.max(expensiveComputation(next), max)
}

您可以潜在地使用隐式来省略 list 的第一个参数。希望这会有所帮助。

关于scala - 累积结果,直到以功能方式满足某些条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19937254/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com