我实际上是在学习scala,我对尾递归有疑问。以下是scala中带尾递归的阶乘的示例:
def factorial(n: Int): Int = {
@tailrec
def loop(acc: Int, n: Int): Int = {
if (n == 0) acc
else loop(n * acc, n - 1)
}
loop(1, n)
}
我的问题是更新参数acc
,因为我们在函数loop
中这样做可以视为副作用吗?因为在FP中,我们希望预防或减少副作用的风险。
也许我弄错了,但有人可以向我解释这个概念。
感谢您的帮助
答案 0 :(得分:7)
你实际上并没有在这里更改任何参数的值(因为它们是val
的定义,即使你想这样做也是如此。
你返回一个新值,根据传入的参数计算(只有那些)。正如@ om-nom-nom在他的评论中指出的那样,是纯函数的定义。