尾递归和副作用

时间:2012-10-11 12:24:36

标签: scala functional-programming tail-recursion

我实际上是在学习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中,我们希望预防或减少副作用的风险。

也许我弄错了,但有人可以向我解释这个概念。

感谢您的帮助

1 个答案:

答案 0 :(得分:7)

你实际上并没有在这里更改任何参数的值(因为它们是val的定义,即使你想这样做也是如此。

返回一个新值,根据传入的参数计算(只有那些)。正如@ om-nom-nom在他的评论中指出的那样,是纯函数的定义。