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)
您应该在递归调用中将后自增/后自减更改为前自增/前自减:
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)