【问题标题】:Highest number in a array by recursive divide and conquer通过递归分而治之的数组中的最大数字
【发布时间】:2019-08-08 08:40:35
【问题描述】:

我的代码应该使用递归分治法返回给定数组中的最大数字。

对于 [1,3,2,4,6] 我应该返回 6。

由于某种原因,我的代码在第 47 行是 StackOverflowing

线程“主”java.lang.StackOverflowError 中的异常 在 maiordivisaoconquista.DivideAndConquer.Highest(DivideAndConquer.java:47)

public class DivideAndConquer {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) 
{
   Scanner s = new Scanner (System.in);
   int n = s.nextInt();
   int a[] = new int [n];
   for(int i = 0; i < a.length; i++)
   {
       a[i] = s.nextInt();
   }
   int first = 0;
   int last  = a.length;
   System.out.println(Highest(a,first,last));
}

public static int Highest (int a[], int first, int last)
{

    if(first == last)
    {
        return a[first];
    }
    if (last - first == 1)
    {
        return Math.max(a[first],a[last]);
    }

    else
    {
       int middle = (first +last)/2;
       return(Math.max(Highest(a,first,last),Highest(a,middle+1,last)));
    }

 }
}

【问题讨论】:

    标签: java arrays recursion methods divide-and-conquer


    【解决方案1】:

    像这样改变:

    return(Math.max(Highest(a, first, last),   Highest(a, middle+1, last)));
                                        |
                                        |
                                        V
    return(Math.max(Highest(a, first, middle), Highest(a, middle+1, last)));
    

    您的代码使用相同的 firstlast 值调用自身,因此(通常)会无限递归。

    【讨论】:

    • 这将适用于无限循环,但现在我得到了一个超出范围的数组:线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 5 at maiordivisaoconquista.DivideAndConquer.Highest(DivideAndConquer.java: 37) 在 maiordivisaoconquista.DivideAndConquer.Highest(DivideAndConquer.java:47) 在 maiordivisaoconquista.DivideAndConquer.Highest(DivideAndConquer.java:47) 在 maiordivisaoconquista.DivideAndConquer.main(DivideAndConquer.java:29)
    • 在你的主要方法中你应该有 int last = a.length -1 ;而不是 last = a.length 长度是数组中的元素数,但最后一个元素是 a[length-1] 因此 last = a.length -1
    猜你喜欢
    • 2016-05-01
    • 2013-01-16
    • 1970-01-01
    • 2017-06-07
    • 2017-01-12
    • 2011-12-04
    • 1970-01-01
    • 2017-03-23
    • 2020-09-21
    相关资源
    最近更新 更多