Arrays 通过递归查找数组中的最大值

Arrays 通过递归查找数组中的最大值,arrays,algorithm,search,pseudocode,Arrays,Algorithm,Search,Pseudocode,我很难理解这个伪代码中发生了什么 有人能解释一下每一行发生了什么吗。在回答问题之前,我需要理解这段代码 我知道函数findMax调用助手函数findMaxHelper,然后findMaxHelper使用递归。除此之外,我真的不明白。您正在使用算法从数组中查找最大元素。首先,将数组划分为单独的元素(分割),然后比较元素(征服)。您正在使用递归调用findMaxHelper来分割数组 分而治之的总体思路如图所示: 示例: 这里的max与您的findMaxHelper函数相同,有两个参数,即左和右

我很难理解这个伪代码中发生了什么

有人能解释一下每一行发生了什么吗。在回答问题之前,我需要理解这段代码

我知道函数findMax调用助手函数findMaxHelper,然后findMaxHelper使用递归。除此之外,我真的不明白。您正在使用算法从数组中查找最大元素。首先,将数组划分为单独的元素(分割),然后比较元素(征服)。您正在使用递归调用
findMaxHelper
来分割数组

分而治之的总体思路如图所示:

示例:

这里的
max
与您的
findMaxHelper
函数相同,有两个参数,即


查看示例以更深入地了解该概念。

findMaxHelper每次将数组分成一半,并在左侧、右侧找到最大值:

例如,您有数组
A=[1,3,5,8]
,调用
findMax(A)
->
findMaxHelper(A,0,A.length)


捷豹很好地阐述了这一概念,Paul提供了正确而详细的解释。 为了补充这一点,我想分享一个简单的C代码,让您了解代码是如何实现的 执行。以下是与Jaguar使用的输入相同的代码:

     max1 | max2
     1 3  | 5 8

max1|max2 | max1|max2
1   |3    | 5   |8

递归基本上不建议在数组中查找最大值,因为它不是必需的。 分治算法(递归)的时间开销更大。 但即使你想使用它,你也可以使用我下面的算法。基本上,它将数组中最大的元素放在第一个位置,运行时间几乎是线性的(不过这个算法只是一个递归的幻觉!)

int getRecursiveMax(int arr[],int size){
如果(大小==1){
返回arr[0];
}否则{
如果(arr[0]
#包括
#包括
int高,*a,i=0,n,h;
int max(int*);
int main()
{
printf(“数组大小:”);
scanf(“%d”和“&n”);
a=(int*)malloc(n*sizeof(int));//动态分配

对于(i=0;i@JustinBains
left
right
是数组的第一个和最后一个元素(初始数组和中间数组)的索引。对于任何试图理解递归代码的人,一个一般性的建议是:不要尝试深入和跟随。最好“缩小”并试着理解全局。递归函数通常接受输入,执行基本操作,并对较小的问题重复相同的操作,就像在这个代码段中一样。您应该尝试识别较小的问题,这是理解这类代码的核心。现在发生的一件事是,数组的最大元素是以一种非常昂贵的方式计算的!欢迎这样做。请注意,OP确实要求对psuedo代码进行解释。包含一个没有解释的代码的答案不太可能有用。
     max1 | max2
     1 3  | 5 8

max1|max2 | max1|max2
1   |3    | 5   |8
#include<stdio.h>
int findMaxHelper(int A[], int left, int right){
   int max1,max2;
   int static tabcount;
   int loop;
   for(loop = 0 ; loop <tabcount;loop++) printf("\t");
   tabcount++;
   printf(" Entering: findMaxHelper(A, left = %d ,right = %d)\n\n",left,right);
   if (left == right - 1){ 
      for(loop = 0 ; loop <tabcount;loop++) printf("\t");
      printf("\b\b\b\b\b\b\bLeaving: findMaxHelper(A, left = %d ,right = %d)| returning %d\n\n",left,right , A[left]);
      tabcount--;
      return A[left];
   }
   else
   {
      max1 = findMaxHelper(A, left, (right + left) / 2);
      max2 = findMaxHelper(A, (right + left) / 2, right);

      if (max1 > max2){ 
    for(loop = 0 ; loop <tabcount;loop++) printf("\t");
    printf("\b\b\b\b\b\b\bLeaving: findMaxHelper(A, left = %d ,right = %d) | returning max1=%d\n\n",left,right,max1);
    tabcount--;
    return max1;
    }
      else {
     for(loop = 0 ; loop <tabcount;loop++) printf("\t");
     printf("\b\b\b\b\b\b\bLeaving: findMaxHelper(A, left = %d ,right = %d)| returning max2=%d\n\n",left,right,max2);
     tabcount--;
     return max2;
    }

   }
}

int main (){
    int A[] = { 34,3,47,91,32,0 };
    int Ans =findMaxHelper(A,0,7);  
    printf( "And The Answer Is = %d \n",Ans);
}
Entering: findMaxHelper(A, left = 0 ,right = 7)

     Entering: findMaxHelper(A, left = 0 ,right = 3)

         Entering: findMaxHelper(A, left = 0 ,right = 1)

         Leaving: findMaxHelper(A, left = 0 ,right = 1)| returning 34

         Entering: findMaxHelper(A, left = 1 ,right = 3)

             Entering: findMaxHelper(A, left = 1 ,right = 2)

             Leaving: findMaxHelper(A, left = 1 ,right = 2)| returning 3

             Entering: findMaxHelper(A, left = 2 ,right = 3)

             Leaving: findMaxHelper(A, left = 2 ,right = 3)| returning 47

         Leaving: findMaxHelper(A, left = 1 ,right = 3)| returning max2=47

     Leaving: findMaxHelper(A, left = 0 ,right = 3)| returning max2=47

     Entering: findMaxHelper(A, left = 3 ,right = 7)

         Entering: findMaxHelper(A, left = 3 ,right = 5)

             Entering: findMaxHelper(A, left = 3 ,right = 4)

             Leaving: findMaxHelper(A, left = 3 ,right = 4)| returning 91

             Entering: findMaxHelper(A, left = 4 ,right = 5)

             Leaving: findMaxHelper(A, left = 4 ,right = 5)| returning 32

         Leaving: findMaxHelper(A, left = 3 ,right = 5) | returning max1=91

         Entering: findMaxHelper(A, left = 5 ,right = 7)

             Entering: findMaxHelper(A, left = 5 ,right = 6)

             Leaving: findMaxHelper(A, left = 5 ,right = 6)| returning 0

             Entering: findMaxHelper(A, left = 6 ,right = 7)

             Leaving: findMaxHelper(A, left = 6 ,right = 7)| returning 0

         Leaving: findMaxHelper(A, left = 5 ,right = 7)| returning max2=0

     Leaving: findMaxHelper(A, left = 3 ,right = 7) | returning max1=91

 Leaving: findMaxHelper(A, left = 0 ,right = 7)| returning max2=91

And The Answer Is = 91 
        int getRecursiveMax(int arr[], int size){
          if(size==1){
                      return arr[0];
          }else{
                 if(arr[0]< arr[size-1]){
                                      arr[0]=arr[size-1];
                     }
                 return(getRecursiveMax(arr,size-1));
            }

          } 
#include<stdio.h>
#include<stdlib.h>

int high,*a,i=0,n,h;
int max(int *);

int main()
{

    printf("Size of array: ");
    scanf("%d",&n);

    a=(int *)malloc(n*sizeof(int));         //dynamic allocation
    for(i=0;i<n;i++)
    {
        scanf("%d",(a+i));
    }
        i=0;
    high=*a;
    h=max(a);
    printf("The highest element is %d\n",h);
}

int max(int *a)
{

    if(i<n)
    {   
        if(*(a+i)>high)
        {high=*(a+i);}
    i++;
    max(a);                     //recursive call
    }

    return high;
}