web-dev-qa-db-ja.com

頭と尾の再帰の違い

これら2つの再帰的な戦略の違いを取得しようとしています。

私に言われた定義は次のとおりです。

Tail Recursion:呼び出しが戻った後に何もする必要がない場合、つまり呼び出しが戻ると、呼び出した関数から戻り値がすぐに返されます

Head Recursion:関数の最初のステートメントが再帰呼び出しである場合、呼び出しはヘッド再帰です。

24
Scarl

head recursionでは、再帰呼び出しが発生した場合、関数内の他の処理の前に再帰呼び出しが行われます(関数の先頭または先頭で発生すると考えてください)。

tail recursionでは、逆です。再帰呼び出しの前に処理が行われます。 2つの再帰的なスタイルを選択することは任意のように思えるかもしれませんが、選択することですべての違いが生まれます。

パスの先頭に1つの再帰呼び出しがあるパスを持つ関数は、ヘッド再帰と呼ばれるものを使用します。以前の展示の階乗関数は、頭部再帰を使用しています。再帰が必要であると判断すると、最初に行うことは、デクリメントされたパラメーターで自身を呼び出すことです。パスの末尾に単一の再帰呼び出しがある関数は、末尾再帰を使用しています。 この記事を参照

再帰の例:

public void tail(int n)         |     public void head(int n)
{                               |     {
    if(n == 1)                  |         if(n == 0)
        return;                 |             return;
    else                        |         else
        System.out.println(n);  |             head(n-1);
                                |
    tail(n-1);                  |         System.out.println(n);
}                               |     }

メソッドの最後に再帰呼び出しが発生する場合、tail recursionと呼ばれます。末尾再帰はsimilar to a loopです。 method executes all the statements before jumping into the next recursive call

beginning of a method, it is called a head recursionで再帰呼び出しが発生した場合。 method saves the state before jumping into the next recursive call

27