我需要帮助创建一个在向量中找到最大值的递归方法。该方法应具有以下签名:
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.
答案 0 :(得分:0)
最好让一个方法找到数组中最大的方法,直到达到某个索引:
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);
这避免了所有的阵列复制,这是相当昂贵的。您的代码会进行大量复制,这会使大型数组效率低下。在这个版本中,你传递相同的数组,但作为参考;并且你告诉方法它在考虑阵列时允许进入多远。
关键观察是数组的最大元素是最后一个元素,或者是除最后一个元素之外的数组的最大值。这与你的想法基本相同,你从头开始;它只是使终止案例更易于编写和理解。
答案 1 :(得分:0)
直接从Javadoc获取您正在使用的方法(Arrays.copyOfRange
):
original - 要从中复制范围的数组
from - 要复制的范围的初始索引,包括
to - 要复制的范围的最终索引,独占。 (该索引可能位于数组之外。)
强调我的。
答案 2 :(得分:0)
您有一个错误的错误,因为您使用了copyOfRange
错误。它应该是:
maxRecursive(Arrays.copyOfRange(v, 1, v.length));
这是因为to
参数是独占。因此,当您的to
为v.length - 1
时,数组最终会在最后一个元素之前查看从1
到元素的所有内容。
如有疑问,请阅读Javadocs。
答案 3 :(得分:0)
您必须更改方法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];
}
}