通过递归分而治之的数组中的最大数字

Posted

技术标签:

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

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

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

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

线程“主”java.lang.***Error 中的异常 在 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)));
    

 

【问题讨论】:

【参考方案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

以上是关于通过递归分而治之的数组中的最大数字的主要内容,如果未能解决你的问题,请参考以下文章

整数数组和的分治算法

分而治之——返回数组

使用分而治之的数组的第二大元素

最大子数组:分而治之

分而治之算法找到两个有序元素之间的最大差异

c_cpp 使用分而治之的方法查找未排序数组中的最小值和最大值