说我一直走出界限([32],[36])我几乎改变了所有我能想到的东西。有什么建议吗?
public class FindMaxRecursive {
public static void main(String[] args) {
Scanner kbd = new Scanner(System.in);
int[] a = new int[5];
System.out.println("Enter 5 integers: ");
int i;
for (i = 0; i < 5; i++) {
a[i] = kbd.nextInt();
}
System.out.println("largest element in array: " + findMax(a, i));
}
public static int findMax(int[] a, int i) {
if (i > 0) {
// exception on the next line
return Math.max(a[i], findMax(a, i + 1));
}
else {
return a[0];
}
}
}
输入,输出和输出例外:
Enter 5 integers:
1 2 3 4 5
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5
at Snippet.findMax(Snippet.java:19)
at Snippet.main(Snippet.java:14)
findMax
声明中的if
。
答案 0 :(得分:4)
在for
循环结束时,变量i
留有5
,因此它指向数组外部。 (数组的有效索引是0到4.)因此,当您稍后(在findMax()
内)使用它来寻址a[i]
时,您正在访问一个不存在的元素。
我强烈建议你学习使用调试器,这样你就可以自己找到这样的简单错误,而不必询问stackoverflow。
答案 1 :(得分:0)
在对findMax
的初始调用中,您传递的i
已经增加到5
。但是Java中的索引从0
到length - 1
或4
在这里运行。通过i - 1
来引用数组中的最后一个位置。
但是,您仍然会尝试查看i
中的i + 1
和findMax
位置,这些位置仍将超出范围。您已经获得的递归方法找到当前元素与其前数组其余部分的最大值之间的最大值,因此您需要在递归调用中传递i - 1
,而不是i + 1
。