1

我希望这个问题不是骗人的。似乎大多数问题都涉及一个语句中的多个递归调用,即:return func(n - 1) * func(n - 2)。我的问题涉及if/else语句中的多个递归调用。这就是我所拥有的(来自做一个 Project 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,这仍然被认为是尾递归吗?

4

1 回答 1

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

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

于 2013-08-14T21:32:51.243 回答