3

再帰呼び出しで関数の順序を取得する最も簡単な方法は何ですか? たとえば、再帰関数がある場合、基本ケースが見つかるまで自分自身を呼び出し続け、一度に 1 つの関数を返します。最初に返される関数の順序は 0、2 番目の関数は順序 1、というように...順序情報を取得する簡単な方法は何ですか? たとえば、次数 3 の関数の場合、何か特別なことをしたいとします。

編集:スタックの一番上にある関数をゼロにしたい。

Edit2:私が解決しようとしている問題は、バイナリ ツリーの順序どおりのトラバーサルの n 番目の要素を返すことです。

4

3 に答える 3

5

このような再帰関数で開始する場合

void recursive(int p1, String p2, long p3) {
    ...
    if (someCondition) {
        recursive(nextP1, nextP2, nextP3);
    }
}

これを次のように変更します。

void recursive(int p1, String p2, long p3, int level) {
    ...
    if (someCondition) {
        recursive(nextP1, nextP2, nextP3, level+1);
    }
}

次に、呼び出してゼロからレベルを開始します

recursive(initialP1, initialP2, initialP3, 0);

level上記の呼び出し回数が表示されrecursiveます。

編集:(ゼロアットザトップ)

関数を変換してそのレベルを返すことで、「ゼロを先頭に」戦略を実装することもできます。

int recursive(int p1, String p2, long p3) {
    if (baseCase) {
        return 0;
    }
    ...
    int level = 0;
    if (someCondition) {
        level = 1+recursive(nextP1, nextP2, nextP3);
    }
    return level;
}

この場合level、最後の再帰呼び出しが返されるまで、あなたを見つけることができないことに注意してください。

于 2012-09-14T22:26:36.580 に答える
3

dasblink が提供したケースは、再帰を深くするにつれてレベルカウンターが上昇する (インクリメントする) ため、実装に関して提案したことの反対をカバーします。

再帰を深くするにつれて減少させたい場合は、正確な再帰の深さを事前に知っていることを意味します。

ほとんどの場合、再帰を使用しない正確な再帰の深さがわかっている場合は、ループ (for、while、repeat/until など) を使用します。実際、このような場合に再帰を使用すると、再帰スタックが割り当てられ (メモリ消費量が多くなり)、ループがはるかに効率的になるため、あまり最適ではありません。

于 2012-09-14T22:36:35.517 に答える
0
  • レベル 0 が最後の「ネストされた呼び出し」である必要がある場合、「さらに 3 回のネストされた呼び出しの後、関数は値を返す」とは言えないため、停止問題と同様に一般的に判断できない問題です。特定の関数の計算をシミュレートすることによってのみ先読みが可能です。

  • レベル 0 が最初の呼び出しである場合、それは非常に単純であり、レベルをメソッドのパラメーターとして使用してインクリメントすることができます。

ところで、興味深い問題です。http://en.wikipedia.org/wiki/Halting_problemを参照してください。

于 2012-09-14T22:35:35.197 に答える