if / else语句和尾递归中的多个递归调用

时间:2013-08-14 21:28:33

标签: 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)
}

我的问题是,因为我正在进行两个单独的递归调用,一个在else if内,另一个在最后else内,这仍然被认为是尾递归的吗?

1 个答案:

答案 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)
}

是的,它被认为是尾递归函数。