1

我正在char array使用递归进行字符串(即)处理。在我的recursion tree, 位于的字符串child长度小于 1 wrtparent并且相同高度的所有子项具有相同长度的字符串但不同的字符。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的循环具有与迭代一样多的元素,这可能表明事实并非如此。)

如果这不是故意的,只需将递归调用向下移动一行,即在}循环结束之后。

如果是故意的,问题可能是你还没有理解递归是如何工作的。停止条件在某处得到满足的事实并未全局记录,并且仅与满足停止条件的单个调用相关。getMinLen递归调用的循环本身就达到了这一点for(除非您从一个非常短的字符串开始),并且该(外部)for循环继续执行所有后续调用 --getMinLen为什么要停止?为了让它停止,一个全局布尔变量会有所帮助,但非常不雅。或者,您可以使函数返回一个布尔值,并在每次递归调用之前检查前一个是否返回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 语句。要离开一个方法,您必须到达方法的返回语句或结尾(如果返回类型为 ,则它充当隐式返回语句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

如果你只想要一次迭代然后停止,你为什么要把循环放在那里?

于 2012-04-05T08:29:13.383 回答