Scala 中带有累加器的辅助方法

Helper method with accumulators in Scala

下面是一个例子,用于说明如何使用不可变变量。 (1) 此方法执行什么功能以及 (2) 哪个部分被视为累加器?

def fib(n: Int): Int = {
  def fibIter(i: Int, a: Int, b: Int): Int =
    if (i == n) a else fibIter(i+1, b, a+b)
  fibIter(0, 0, 1)
 }

正如@jwvh 在他的评论中提到的,这是一个用于计算 Fibonacci sequence 的第 n 项的函数。

这个特定的实现是尾递归的,并使用内部函数 fibIter 作为 "accumulator." 通常为了编写递归函数的尾递归实现,定义一个内部尾部很有用累加所需结果的递归函数。外部函数将使用一些默认参数调用这个内部函数。有时这个内部函数被称为"accumulate"或"go"或"loop"等

这是我喜欢的与上述类似的斐波那契实现...

def fibonacci(n: Int): Int = {
  @annotation.tailrec
  def iterate(i: Int, a: Int, b: Int): Int =
    if (i == n) a else iterate(i+1, b, a+b)
  iterate(0, 0, 1)
}

...在这里我更喜欢调用内部函数 iterate 因为这是对函数正在做什么的更准确的描述(即,它并没有真正积累任何东西)。