在“惯用” 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)
}

这是标准的“功能”循环方式。

10-02 04:02
查看更多