【发布时间】:2012-10-02 02:41:24
【问题描述】:
我实际上正在学习 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 中,我们希望防止或减少副作用的风险。
也许我弄错了,但有人可以向我解释这个概念。
感谢您的帮助
【问题讨论】:
-
不,它没有。纯函数根据定义不包含副作用,并且循环是纯函数(它仅取决于传入的参数)。
-
我认为应该将
@tailrec移动到您的loop函数中。函数loop是递归的,而factorial不是——它从不调用自己,它只调用loop。 -
谢谢彼得,你完全正确!!!
标签: scala functional-programming tail-recursion