-3

再帰の深さを決定する方法を教えてください。私は2つの再帰関数のコードを持っています:

public class MyClass {
    int ReccusionFunc1(int tmp0, int tmp1, int tmp2) {
        return ReccusionFunc1(tmp0, tmp1, tmp2);
    }
}

public class MyClass {
    int ReccursionFunc2(int tmp0, int tmp1, int tmp2) {
        int a = tmp0 + tmp1;
        int b = tmp1 + tmp2;
        int c = tmp2 + tmp0;
        return ReccusionFunc2(a, b, c);
    } 
}

これら 2 つの無限再帰のうち、エラー StackOverflowError で失敗するのはどれ
ですか? 分析的に計算または定義できますか?

4

4 に答える 4

4

再帰の深さを決定する方法を教えてください

再帰メソッド (ReccursionFunc1またはReccursionFunc2) の各呼び出しで値が増加するパラメーターを渡します。

これら 2 つの無限再帰のどちらが以前にエラー StackOverflowError で失敗するか

スタック上により多くのメモリを割り当てるもの、 id ReccursionFunc2.

分析的に計算または定義できますか?

いいえ、環境にもよります。

于 2013-10-31T20:33:34.483 に答える
0

グローバルカウンター変数を設定します。最初の繰り返し呼び出しの前に初期化します。次に、呼び出しごとにインクリメントします。そして、繰り返しステートメントから飛び出すときに値を出力します。

また

再帰メソッドが呼び出される前に整数を初期化し、再帰メソッドに整数を入力として取り、それをインクリメントして返します(複数のものを返す必要がある場合は、他のものと一緒に配列に入れます)、次に出力しますそれは最後に。

無限再帰ループが問題の場合。任意の上限でプロセスを再帰ループから抜け出す「上限」if ステートメントをどこかに設定します。ただし、これは実装が正しくないことを示しており、「良い」解決策と見なすべきではありません。たとえば、特定のスーパービューがどこにあるのかわからないために、ビュー階層 (iOS / android / など) を掘り下げようとしている場合。階層が巨大になる可能性があるため、何らかの上限が必要になります。再帰的に検索するのではなく、探しているビューが階層スタックのどこにあるのかを正確に知る必要があります。

于 2013-10-31T20:36:40.060 に答える
0

再帰の深さを決定するために、追加のパラメーターを追加できます。

public class MyClass {
int ReccusionFunc1(int tmp0, int tmp1, int tmp2, int depth) {
    return ReccusionFunc1(tmp0, tmp1, tmp2, ++depth);
}

new MyClass().ReccusionFunc1(1, 2, 3, 1);

public class MyClass {
int ReccursionFunc2(int tmp0, int tmp1, int tmp2, int depth) {
    int a = tmp0 + tmp1;
    int b = tmp1 + tmp2;
    int c = tmp2 + tmp0;
    return ReccursionFunc2(a, b, c, ++depth);
}

new MyClass().ReccursionFunc2(1, 2, 3, 1);
于 2013-10-31T20:50:28.253 に答える
0

繰り返しながらカウンターを出力 >.>

于 2013-10-31T20:33:22.183 に答える