我希望这个问题不是一个骗局。似乎大多数问题在一个语句中引用多个递归调用,即:return func(n - 1) * func(n - 2)
。我的问题涉及if/else
语句中的多个递归调用。这就是我所拥有的(来自项目Euler问题):
def multOfThreeAndFive(n: Double): Double = {
def loop(next: Double, acc: Double): Double = {
if (next < 0) acc
else if (next % 3 == 0 || next % 5 == 0) loop(next - 1, acc + next)
else loop(next - 1, acc)
}
loop(n - 1, 0)
}
我的问题是,因为我正在进行两个单独的递归调用,一个在else if
内,另一个在最后else
内,这仍然被认为是尾递归的吗?
答案 0 :(得分:6)
使用特殊注释可以轻松检查。如果编译器无法将代码优化为尾递归仿真,则编译将失败:
def multOfThreeAndFive(n: Double): Double = {
@annotation.tailrec
def loop(next: Double, acc: Double): Double = {
if (next < 0) acc
else if (next % 3 == 0 || next % 5 == 0) loop(next - 1, acc + next)
else loop(next - 1, acc)
}
loop(n - 1, 0)
}
是的,它被认为是尾递归函数。