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
因为这是对函数正在做什么的更准确的描述(即,它并没有真正积累任何东西)。
下面是一个例子,用于说明如何使用不可变变量。 (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
因为这是对函数正在做什么的更准确的描述(即,它并没有真正积累任何东西)。