【发布时间】:2013-11-12 18:37:33
【问题描述】:
我在循环中有一些昂贵的计算,我需要找到计算产生的最大值,但如果它等于 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)
我的问题:这个行为模板是否有名称并反映在 scala 集合库中?
更新:Do something up to N times or until condition is met in Scala - 有一个有趣的想法(使用惰性并在末尾找到或存在)但它并不直接适用于我的特定情况或需要可变 var 来跟踪累加器。
【问题讨论】:
-
如果性能是一个非常高的优先级,请考虑
if (v == UpperBound) return v。这种非本地返回是通过抛出异常来实现的,如果你不能@tailrec并且列表很长,它可能会更快。
标签: scala functional-programming