4

これは末尾再帰を示す良い例ですか?

public printName(){
    System.out.println("Smith");
    printName();
}

私はこれを実際に行うつもりはありませんが、これを試験の例として挙げています。これは正しいですか?

4

3 に答える 3

19

いいえ、次の 2 つの理由からです。

  • 末尾再帰は、コンパイラがサポートしている場合にのみ価値があります (末尾呼び出しの最適化)。Javaでは、それはまだで終わりますStackOverflowError

  • いくつかの停止状態を示すとよいでしょう。あなたのコードは、永遠にループを実行するのと同じです。

Scala でほぼ同じコードを検討してください。唯一の違いは、Scala コンパイラー末尾呼び出しの最適化を実行し、ループが永久に実行されることです。

def printName() {
  println("Smith"); 
  printName()
}
于 2012-07-21T13:57:44.073 に答える
14

末尾再帰のより良い例は、次のようなものです。

public printName(int level){
    if( level <= 0 )
         return;
    System.out.prntln("Smith");
    printName(--level);
}

この例には、再帰が終了する重要な部分が含まれています。

これに加えて:他の回答がすでに述べたように:Javaは末尾再帰を最適化しないため、この言語で使用しても意味がありません。したがって、基本的にはアルゴリズムを自分で最適化することになります - 反復的にすることによって。それが末尾再帰のポイントです。任意の末尾再帰アルゴリズムを反復アルゴリズムに変換できることを証明できます。

于 2012-07-21T14:09:37.653 に答える
1

プログラムの末尾で再帰するので、これは末尾再帰の例だと思います:)しかし、JVMがこれを最適化するとは思いません。これはおそらくあなたが望むものです。

于 2012-07-21T13:58:55.140 に答える