1

この質問がだまされないことを願っています。ほとんどの質問は、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)
}

私の質問は、私は 2 つの別々の再帰呼び出しを行っているので、1 つelse ifは last の内部で、もう 1 つは last の内部で、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 に答える