每当我尝试运行此代码时,它都会让我超出绑定范围。任何人都可以指出我的错误。
package com.programs.interview;
import java.util.Scanner;
public class FindMaxNumInArray {
public static void main (String[] args)
{
Scanner scan = new Scanner (System.in);
System.out.print("Enter the size of the array: ");
int arraySize = scan.nextInt();
int[] myArray = new int[arraySize];
System.out.print("Enter the " + arraySize + " values of the array: ");
for (int i = 0; i < arraySize; i++)
myArray[i] = scan.nextInt();
for (int j = 0; j < arraySize; j++)
System.out.println(myArray[j]);
System.out.println("In the array entered, the larget value is "+ maximum(myArray,arraySize) + ".");
}
public static int maximum(int[] arr, int Arraylength){
int tmp;
if (Arraylength == 0)
return arr[Arraylength];
tmp = maximum(arr, Arraylength -1);
if (arr[Arraylength] > tmp)
return arr[Arraylength];
return tmp;
}
}
输出
输入数组的大小:5输入数组的5个值:1 2 3 4 5 1 2 3 4 5线程“main”中的例外情况 java.lang.ArrayIndexOutOfBoundsException:5 at com.programs.interview.FindMaxNumInArray.maximum(FindMaxNumInArray.java:26) 在 com.programs.interview.FindMaxNumInArray.main(FindMaxNumInArray.java:17)
答案 0 :(得分:3)
这是问题所在:
if (arr[Arraylength] > tmp)
有效数组索引从0
转到length-1
。 array[array.length]
始终无效,并且在首次通话时,ArrayLength
等于arr.length
。
说实话,目前还不清楚你为什么要使用递归。迭代解决方案会简单得多 - 但如果数组为空,您需要计算出您想要做的事情。
编辑:如果你真的想要我如何编写递归表单,那就是这样的:/** Returns the maximum value in the array. */
private static int maximum(int[] array) {
if (array.length == 0) {
// You need to decide what to do here... throw an exception,
// return some constant, whatever.
}
// Okay, so the length will definitely be at least 1...
return maximumRecursive(array, array.length);
}
/** Returns the maximum value in array in the range [0, upperBoundExclusive) */
private static int maximumRecursive(int[] array, int upperBoundExclusive) {
// We know that upperBoundExclusive cannot be lower than 1, due to the
// way that this is called. You could add a precondition if you really
// wanted.
if (upperBoundExclusive == 1) {
return array[0];
}
int earlierMax = maximumRecursive(array, upperBoundExclusive - 1);
int topValue = array[upperBoundExclusive - 1];
return Math.max(topValue, earlierMax);
// Or if you don't want to use Math.max
// return earlierMax > topValue ? earlierMax : topValue;
}
答案 1 :(得分:2)
您无法访问
arr[Arraylength]
最后一个元素是
arr[Arraylength -1]
例如,如果你有
int arr[] = new int[5];
然后元素将位于4
,因为索引从0
arr[0], arr[1], arr[2], arr[3], arr[4]
答案 2 :(得分:0)
您的问题出现在以下代码中:
if (arr[Arraylength] > tmp)
return arr[Arraylength];
索引从0开始,因此您将超出包含5个元素[1,2,3,4,5]
索引的数组:[0,1,2,3,4]
。
答案 3 :(得分:0)
我会使用一个普通的循环。 Java没有特别好地进行递归。
public static int maximum(int[] arr) {
int max = Integer.MIN_VALUE;
for(int i : arr) if (i > max) max = i;
return max;
}
答案 4 :(得分:0)
这里
System.out.println("In the array entered, the larget value is "+ maximum(myArray,arraySize) + ".");
你正在传递数据大小,在最大方法中你要返回 arr [Arraylength] ,它给出了ArrayIndexOutOfBound,所以在调用最大值时更改(yArray,arraySize- 1)或返回arr [Arraylength-1] 声明。