Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用递归获取数组中的最大元素_Java_Arrays_Recursion - Fatal编程技术网

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

Java 使用递归获取数组中的最大元素,java,arrays,recursion,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);

我有一个任务是使用递归来获得任何给定数组中的最大元素。我有下面的代码,除非数组中最大的元素是最后一个,否则这些代码将正常工作

不知道如何纠正这个问题

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;
    }
}
}
import java.util.Scanner;
公共类递归Largestinarray
{
公共静态void main(字符串[]args)
{
int max=-999;
扫描仪扫描=新扫描仪(System.in);
System.out.print(“输入数组的大小:”);
int arraySize=scan.nextInt();
int[]myArray=新int[arraySize];
System.out.print(“输入数组的“+arraySize+”值:”);
for(int i=0;i
您的第一个条件是问题:

if (myArray.length == 1)
{
    return max;
}
替换为:

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

如果数组只有一个元素,则返回上一个最大值。如果max是最后一个元素,它将被跳过。

您永远不会计算最终元素-当数组的大小为1时,您只需返回max,因此您永远不会实际检查数组中的最终元素


还有一个注释——与其每次都创建数组的副本,为什么不在每次递归时将当前索引传递到函数中呢

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

另外,最好将
max
初始化为Integer.MIN_值,而不是-999的任意值


另一方面,一旦你让你的代码工作起来,它仍然是非常低效的。你可以考虑发布它来获得反馈。

<如何区分和征服?< /P>
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)调用它。

只是一个小提示。如果传递了上次检查的索引,则不需要在每一步都创建新数组。是否确定此代码仅在最后一个元素最大的情况下有效?它甚至不能为我编译。@Mike-我认为最后一个
else if
应该是一个
else
。我把这归因于发帖时的打字错误。可能是dup:谢谢。发布后我看到了错误所在,但不确定如何更正。你的答案很好,谢谢。我知道这可能不是最好的方法。现在我完成作业所需要的只是学习Java的基础知识。但我也会按照你的建议发布。