使用递归获取数组中的最大元素

时间:2011-11-15 14:30:35

标签: java arrays recursion

我有一个使用递归来获取任何给定数组中最大元素的赋值。我有以下代码,除非最大的元素是数组中的最后一个,否则它将起作用。

不确定如何更正?

import java.util.Scanner;
public class RecursionLargestInArray
{
public static void main (String[] args)
{
    int max = -999;
    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 < myArray.length; i++)
        myArray[i] = scan.nextInt();
    for (int i = 0; i < myArray.length; i++)
        System.out.println(myArray[i]);
    System.out.println("In the array entered, the larget value is "
                        + getLargest(myArray, max) + ".");
}

public static int getLargest(int[] myArray, int max)
{    
    int i = 0, j = 0, tempmax = 0;
    if (myArray.length == 1)
    {
        return max;
    }
    else if (max < myArray[i])
    {
        max = myArray[i];
        int[] tempArray = new int[myArray.length-1];
        for (i = 1; i < myArray.length; i++)
        {
            tempArray[j] = myArray[i];
            j++;
        }
        tempmax = getLargest(tempArray, max);
        return tempmax;
    }
    else if
    {
        int[] tempArray = new int[myArray.length-1];
        for (i = 1; i < myArray.length; i++)
        {
            tempArray[j] = myArray[i];
            j++;
        }
        tempmax = getLargest(tempArray, max);
        return tempmax;
    }
}
}

4 个答案:

答案 0 :(得分:6)

你的第一个条件是问题:

if (myArray.length == 1)
{
    return max;
}

将其替换为:

if (myArray.length == 1)
{
    return myArray[0] > max ? myArray[0] : max;
}

如果数组只包含一个元素,则返回先前的最大值。如果max是最后一个元素,则会跳过它。

答案 1 :(得分:3)

你永远不会评估最后一个元素 - 当数组的大小为1时你只返回max,所以你永远不会实际检查数组中的最后一个元素。

另外,评论 - 而不是每次创建数组的副本,为什么不在每次递归时简单地将当前索引传递给您的函数?

答案 2 :(得分:2)

当数组长度为1时,getLargest没有针对max测试(单个)数组元素;它只是返回max。这就是为什么它总是跳过最后一个元素。

顺便说一句,最好将max初始化为Integer.MIN_VALUE而不是任意值-999。

另外,一旦你的代码工作,它仍然会非常低效。您可以考虑将其发布到codereview.stackexchange.com以获得反馈。

答案 3 :(得分:2)

如何分而治之?

private static int findLargest(int lowerLimit, int upperLimit) {
    if (lowerLimit == upperLimit) {
        return temp[lowerLimit];
    } else if (upperLimit - lowerLimit == 1){
        return Math.max(temp[upperLimit], temp[lowerLimit]);
    } else {
        int pivot = (upperLimit - lowerLimit + 1)/2;
        int firstHalf = findLargest(lowerLimit, lowerLimit + pivot);
        int secondHalf = findLargest(upperLimit - pivot , upperLimit);
        return Math.max(firstHalf, secondHalf);
    }
}

当然temp是全局数组..并且开始递归,你用findLargest(0,temp.length)调用它