为什么@tailrec 不允许这个功能?

Why does @tailrec not permit this function?

我想用 tailrec

在 Scala 中做 ln(N!)
  @tailrec
  final def recursiveLogN(n: Int): Double = {
    if (n <= 1) {
      return 0
    }
    Math.log(n) + recursiveLogN(n - 1)
  }

编译错误:

could not optimize @tailrec annotated method recursiveLogN: it contains a recursive call not in tail position
    Math.log(n) + recursiveLogN(n - 1)

递归调用应该是最后一个方法调用,你的代码片段的编写方式只是最后一个表达式的一部分。

可以重写为:


  @tailrec
  final def recursiveLogN(n: Int, accum: Double = 0): Double = {
    if (n <= 1) {
      return accum
    }
   recursiveLogN(n - 1, accum+ Math.log(n))
  }

然后就可以进行尾调用消除了