在 Scala 中编写阶乘尾递归函数

Vas*_*asu 5 recursion functional-programming scala tail-recursion function

我正在尝试以下面的方式编写尾递归函数,但编译器抛出错误:

方法的参数太多了:(v1: Int)Int in trait Function1 else factorial(x-1, x*acc)

我曾尝试用 Function2 替换 Function1 并给 Function2[Int, Int, Int] = new Function2[Int, Int, Int]

但它仍然给我带来了同样的错误。有人能指出我哪里出错了吗?

import scala.annotation.tailrec
var factorial: Function1[Int, Int] = new Function1[Int, Int] {
    @tailrec override def apply (x:Int, acc:Int=1): Int = {
        if (x<=1) acc
        else factorial(x-1, x*acc)
    }
}

factorial(5)
Run Code Online (Sandbox Code Playgroud)

Yev*_*iuk 8

当你传递两个参数时,你apply里面Function1必须只带一个参数。

您可以按如下方式重写它:

var factorial: Function1[Int, Int] = new Function1[Int, Int] {
  def apply (x:Int): Int = {
    @tailrec def loop(x: Int, acc: Int = 1): Int = {
      if (x<=1) acc
      else loop(x-1, x*acc)
    }
    loop(x)
  }
}
Run Code Online (Sandbox Code Playgroud)