在《Scala函数式编程》一书中,为了解释函数式编程中递归通常比命令式迭代更常用,作者通过使用一个名为“go”或“loop”的辅助函数展示递归的阶乘函数,并指出这是功能性Scala编程的标准做法。
...
def factorial(n: Int): Int = {
@tailrec def go(n: Int, acc: Int): Int = {
if (n <= 0 ) acc
else go(n - 1, n*acc)
}
go(n, 1)
}
...但是如果不使用辅助函数,同样可以更加简洁地定义它:
...
def factorial(n: Int): Int = {
if (n <= 0) 1
else n * factorial(n - 1)
}
我理解,在递归中通过利用堆栈帧并向前一级堆栈帧“传递”返回值,可以实现积累值和避免变异。在这里,作者似乎正在使用显式的累加器参数来实现类似的目的。
使用辅助函数来累加值是否有优势,还是他们使用这个示例来展示递归如何与命令式迭代相关联,通过向辅助函数显式传递状态来实现?