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,这仍然不能解释您使用的是哪种数据结构。它是一个向量,还是一个普通的整数数组?(请编辑问题,不要提及您未使用的问题)检查此项:(: