Java 在数组递归方法中查找最大int值
我需要帮助创建一个递归方法来查找向量中的最大值。该方法应具有以下签名:Java 在数组递归方法中查找最大int值,java,arrays,recursion,Java,Arrays,Recursion,我需要帮助创建一个递归方法来查找向量中的最大值。该方法应具有以下签名: public int max(int[] v) 并使用私人帮助方法 以下是我尝试使用的方法: private int biggest(int a, int b){ if(a > b){ return a; } else{ return b; } } public int maxRecursive(int[] v){ if(v.length &g
public int max(int[] v)
并使用私人帮助方法
以下是我尝试使用的方法:
private int biggest(int a, int b){
if(a > b){
return a;
}
else{
return b;
}
}
public int maxRecursive(int[] v){
if(v.length > 1){
return biggest(v[0], maxRecursive(Arrays.copyOfRange(v, 1, v.length - 1)));
}
else{
return v[0];
}
}
然而,所有这些似乎都是返回数组的中间值。
例如:如果数组是`{1,2,3,5,6,7,8}
该方法返回5。您最好使用一个方法,在数组中找到最大的索引:
public static int findMax(int[] arr, int lastPos) {
if (lastPos==0)
return arr[lastPos];
else
return biggest(arr[lastPos], findMax(arr, lastPos-1));
}
最大的是
findMax(arr, arr.length-1);
这避免了所有的数组复制,这是相当昂贵的。您的代码进行了大量复制,这将使大型阵列的效率低下。在这个版本中,传递相同的数组,但作为引用;然后告诉方法在考虑数组时允许走多远
关键的观察结果是,数组的最大元素要么是最后一个元素,要么是不包括最后一个元素的数组的最大值。这与你的想法基本相同,你从一开始就开始了;它只是使终止案例更易于编写和理解。直接从Javadoc获取您正在使用的方法(
Arrays.copyOfRange
):
原始-要从中复制范围的数组
from—要复制的范围的初始索引,包括
to—要复制的范围的最终索引,独占。(此索引可能位于数组之外。)
强调我的错误。您有一个off by one错误,因为您使用的
copyOfRange
错误。应该是:
maxRecursive(Arrays.copyOfRange(v, 1, v.length));
这是因为to
参数是独占的。因此,如果您的to
为v.length-1
,数组只会查看从1
到最后一个元素之前的元素的所有内容
如有疑问,请阅读。您必须更改maxRecursive方法
public int maxRecursive(int[] v){
if(v.length > 1){
return biggest(v[0], maxRecursive(Arrays.copyOfRange(v, 1, v.length)));
}
else{
return v[0];
}
}
您说必须在向量中找到它,但您的代码显示您在原语数组中搜索。是哪一个?还有,你为什么要递归地这样做,这毫无意义。做一个直线跑。我在上编程课,这是我的任务之一。设法创建了一个迭代的数组,但我仍然停留在递归方法上。那么您应该如何处理零大小的数组呢?@PontusBrink,这仍然不能解释您使用的是哪种数据结构。它是一个向量,还是一个普通的整数数组?(请编辑问题,不要提及您未使用的问题)检查此项:(: