为什么@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))
}
然后就可以进行尾调用消除了
我想用 tailrec
@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))
}
然后就可以进行尾调用消除了