Rob*_*rto 1 scala tail-recursion
我希望这个问题不是一个骗局.似乎大多数问题在一个语句中引用多个递归调用,即: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)
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,因为我正在进行两个单独的递归调用,一个在内部else if,另一个在最后一个内部else,这仍然被认为是尾递归的吗?
您可以使用特殊注释轻松检查.如果编译器无法将代码优化为尾递归仿真,则编译将失败:
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)
}
Run Code Online (Sandbox Code Playgroud)
是的,它被认为是尾递归函数.