尝试使用递归反转数组时出现 StackOverflowError

1 java stack-overflow arrays algorithm recursion

我编写了一个用于反转数组的递归方法。

它产生一个StackOverflowError,我只是不明白为什么。我确信这很简单,但我已经被困在这里两个小时试图修复它。

我的代码:

public static void reverseArray(char[] input, int i, int j) {
    char temp;
    if (i >= j) return;
    
    else if (i < j) {
        temp = input[i];
        input[i] = input[j];
        input[j] = temp;
        reverseArray(input, i++, j--);
    }
}
Run Code Online (Sandbox Code Playgroud)

Ale*_*nko 5

您应该在递归调用中将后自增/后自减更改为前自增/前自减:

reverseArray(input, ++i, --j);
Run Code Online (Sandbox Code Playgroud)

i++i只会更改当前方法调用范围内存在的值,但递归调用收到的参数将是初始值i对于 也同样如此j)。

所以基本上你传递的是相同的索引,因此得到一个StackOverflowError.

请注意,无需用 包装递归情况else if

public static void reverseArray(char[] input, int i, int j) {
    
    if (i >= j) return;
    
    char temp = input[i];
    input[i] = input[j];
    input[j] = temp;
    
    reverseArray(input, ++i, --j);
}
Run Code Online (Sandbox Code Playgroud)

或者,正如@Slaw在评论中建议的那样,为了避免混淆,您可以在进行递归调用时显式地添加/减去一个:

reverseArray(input, i + 1, j - 1);
Run Code Online (Sandbox Code Playgroud)

  • @SushiSlicer 就我个人而言,我会使用“i + 1”和“j - 1”,只是为了让它完全清楚。 (4认同)