1

char array再帰を使用して文字列 (つまり) 処理を行っています。私のrecursion treeでは、にある文字列のchild長さは 1 未満parentであり、同じ高さのすべての子は同じ長さの文字列ですが、文字が異なります。string新しい長さが古い文字列の長さ以上になるたびに再帰を停止したいのですが、再帰の間にこの条件を挿入できません。を使用するSystem.exit(0)と、完全なプログラムが終了しますが、これは望ましくありません。以下は私のコードスニペットです-

private static void getMinLen(char[] oldStr) {
    int len = oldStr.length;

    /*
     * This terminates the whole program, using break in place of
     * System.exit(0) is not effective
     */
    if (len < 2)
        System.exit(0);

    char[] newStr = new char[len - 1];

    for (int i = 0; i < len - 1; i++) {
        /*
         * Every character is matched with its next character and a new char
         * array is created having length (len-1)
         */
        getMinLen(newStr);
    }
}

System.out.println("length=" + len);実際に3行目に入れたとき。最初は長さを降順で出力しますが、再帰により長さが増加し、減少します。つまり、コンソールには次のように表示されます-

length=6
length=5
length=4
length=3
length=2
length=1
length=3
length=3
length=2
length=1
length=4
length=3
length=2
length=1

新しい長さが古い長さ以上になるたびに、再帰を停止したいだけです。

4

4 に答える 4

1

getMinLen(oldStr)停止条件が満たされない場所への呼び出しのたびに、getMinLen(newStr)数回 (実際には 内の要素の数だけ) 呼び出しますnewStr。これが意図的であるかどうかは、あなたの質問または最初のコメントからは明らかではありません。newStr(ループの反復と同じ数の要素があるという事実は、そうではないことを示唆している可能性があります。)

これが意図的でない場合は、再帰呼び出しを 1 行下に移動します。つまり}、ループの終了の後ろに移動します。

意図的なものである場合、問題は再帰の仕組みを理解していないことにある可能性があります。停止条件がどこかで満たされたという事実は、グローバルに記録されず、停止条件が満たされた単一の呼び出しにのみ関連します。このポイント自体は、再帰呼び出しgetMinLenforループ (非常に短い文字列で開始しない限り) によって到達され、その (外側の)forループは、後続のすべての呼び出しを実行し続けますgetMinLen--Why should it stop? それを止めるには、グローバルブール変数が役立ちますが、非常に洗練されていません。または、関数にブール値を返させ、各再帰呼び出しの前に前の呼び出しが を返したかどうかを確認することもできますtrue。ただし、再帰的アプローチが本当に問題に最も適しているかどうかを再検討することもできます。

于 2012-04-05T12:43:50.947 に答える
0

System.exit(0);メソッドを終了しreturn;たい行で に置き換えるだけです

于 2012-04-05T08:24:48.863 に答える
0

を使用する必要がありますreturn

if (len < 2)
    return;
于 2012-04-05T08:25:12.073 に答える
0

breakループまたは switch ステートメントを「中断」するだけであることに注意してください。メソッドを終了するには、return ステートメントまたはメソッドの最後に到達する必要があります (戻り値の型が の場合、これは暗黙の return ステートメントとして機能しますvoid)。

メソッドは次のことを行うことに注意してください。

初期の長さが 4 であると仮定します。

1. create a new array of length 3 (4-1)
2. call the method recursively 3 times with an array of length 3
3. each new call creates an array of length 2 (3-1)
4. call the method recursively again, now 2 times and with an array of length 2
5. each new call creates an array of length 1 (2-1)
6. call the method recursively again, now once and with an array of length 1
7. each new call creates an array of length 0 (1-1)
8. those methods won't enter the loop since the condition now is `i < 0`, which is false with `i = 0`

したがって、各長さを印刷すると、次の出力が期待されます

4   //initial call
3   //first iteration of step 2
2   //first iteration of step 4
1   //only iteration of step 6 
2   //second iteration of step 4
1
3   //second iteration of step 2
2   
1   
2   
1
3   //third iteration of step 2
2   
1   
2   
1

1 回だけ反復して停止する場合、なぜそこにループを入れたのでしょうか?

于 2012-04-05T08:29:13.383 に答える