在“惯用” Scala中表达此功能的一些想法是什么。或者更确切地说,是否有一种在不牺牲可读性的情况下删除本地变量的方法?
def solve(threshold: Int)(f: Int => Int): Int = {
var sum = 0
var curr = 0
while(sum < threshold) {
sum += f(curr)
curr += 1
}
curr
}
我唯一能想到的就是这个,但是我认为它更长,可读性更差。
def solve2(threshold: Int)(f: Int => Int): Int = {
val resultIterator = Iterator.iterate (0, 0) { case (curr, sum) =>
(curr + 1, sum + f(curr))
}
(resultIterator find (_._2 >= threshold)).get._1
}
最佳答案
最直接的方法是将while循环转换为嵌套的尾递归函数。
def solve(threshold: Int)(f: Int => Int): Int = {
def solveLoop(sum: Int, curr: Int): Int = if (sum < threshold) {
solveLoop(sum + f(curr), curr + 1)
} else {
curr
}
solveLoop(0,0)
}
这是标准的“功能”循环方式。