在数组递归方法中查找max int值

时间:2014-11-06 17:00:50

标签: 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 > 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.

4 个答案:

答案 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参数是独占。因此,当您的tov.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];
    }
}