尾递归和副作用

Dim*_*tri 3 functional-programming scala 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)
  }              
Run Code Online (Sandbox Code Playgroud)

我的问题是更新参数,acc 因为我们在函数中这样做loop可以视为副作用吗?因为在FP中,我们希望预防或减少副作用的风险.

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

谢谢你的帮助

Pét*_*rök 7

你实际上并没有在这里改变任何参数的值(因为它们是val定义的,你不能,即使你想要).

您将返回一个新值,该根据传入的参数计算(仅限于那些).正如@ om-nom-nom在他的评论中指出的那样,是纯函数的定义.

  • 模仿国家并不是明确地说明国家概念隐含地意味着什么.如果(纯)函数依赖于已经执行的计算,那些计算必须产生一些通过其参数传递给函数的值. (2认同)