Recursion 分治递归

Recursion 分治递归,recursion,array-algorithms,Recursion,Array Algorithms,我只是想了解这个例子中的递归是如何工作的,如果有人能帮我解释一下,我将不胜感激。我有以下算法,基本上返回数组中的最大元素: int MaximumElement(int array[], int index, int n) { int maxval1, maxval2; if ( n==1 ) return array[index]; maxval1 = MaximumElement(array, index, n/2);

我只是想了解这个例子中的递归是如何工作的,如果有人能帮我解释一下,我将不胜感激。我有以下算法,基本上返回数组中的最大元素:

int MaximumElement(int array[], int index, int n)
    {  
        int maxval1, maxval2; 
        if ( n==1 ) return array[index];
        maxval1 = MaximumElement(array, index, n/2); 
        maxval2 = MaximumElement(array, index+(n/2), n-(n/2));
        if (maxval1 > maxval2)
            return maxval1;
        else
            return maxval2;
    }

我无法理解递归调用在这里是如何工作的。第一个递归调用是否总是在进行第二个调用时执行?如果有人能给我解释一下,我真的很感激。非常感谢

嵌入的代码注释:

    // the names index and n are misleading, it would be better if we named it:
    // startIndex and rangeToCheck
int MaximumElement(int array[], int startIndex, int rangeToCheck)
{  
    int maxval1, maxval2; 

    // when the range to check is only one cell - return it as the maximum
    // that's the base-case of the recursion
    if ( rangeToCheck==1 ) return array[startIndex];
    // "divide" by checking the range between the index and the first "half" of the range
    System.out.println("index = "+startIndex+"; rangeToCheck/2 = " + rangeToCheck/2);
    maxval1 = MaximumElement(array, startIndex, rangeToCheck/2);
    // check the second "half" of the range
    System.out.println("index = "+startIndex+"; rangeToCheck-(rangeToCheck/2 = " + (rangeToCheck-(rangeToCheck/2)));
    maxval2 = MaximumElement(array, startIndex+(rangeToCheck/2), rangeToCheck-(rangeToCheck/2));

    // and now "Conquer" - compare the 2 "local maximums" that we got from the last step
    // and return the bigger one
    if (maxval1 > maxval2)
        return maxval1;
    else
        return maxval2;
 }
用法示例:

int[] arr = {5,3,4,8,7,2};
int big = MaximumElement(arr,0,arr.length-1);
System.out.println("big = " + big);
输出

index = 0; rangeToCheck/2 = 2
index = 0; rangeToCheck/2 = 1
index = 0; rangeToCheck-(rangeToCheck/2 = 1
index = 0; rangeToCheck-(rangeToCheck/2 = 3
index = 2; rangeToCheck/2 = 1
index = 2; rangeToCheck-(rangeToCheck/2 = 2
index = 3; rangeToCheck/2 = 1
index = 3; rangeToCheck-(rangeToCheck/2 = 1
big = 8

这里发生的事情是两个递归调用都是一个接一个地进行的。第一个搜索数组并返回最大值,第二个搜索另一半并返回最大值。然后比较两个最大值并返回较大的最大值

是的。你猜对了。在两个递归调用
MaximumElement(数组,索引,n/2)
MaximumElement(数组,索引+(n/2),n-(n/2))
中,重复执行第一个调用,直到使用数组的单个元素进行调用为止。然后比较这两个元素并返回最大值。然后继续此比较过程,直到返回最大的元素intn参数(但您可以)。我理解基本情况。我试图理解递归调用,但不明白它是如何工作的。例如:您有一个大小为6(2,4,1,3,5,6)的数组。递归调用是如何工作的?第一个调用是maxva1l=MaximumElement(数组,0,6/2),第二个调用是(maxval1=MaximumElement(数组,0,3/2)?我很抱歉!我想问的是,这个片段如何处理大小为6、值为{2,4,1,3,5,6}的数组?非常感谢!!这不是输出的样子,而是递归调用中的每一步是如何工作的。也许,一个大小为4的数组可能很容易解释。@acc\u所以我添加了两个调试打印(Java)返回到上面的代码并更新了输出-也许它会让您更好地了解执行顺序!仍在尝试理解它,但非常感谢您的响应!!这是我最初理解它的方式,但返回不会在进行所有比较之前终止程序?否。返回只会终止一个特定的fu操作调用执行。其他函数调用将被执行。请更详细一点!:-)您能用一个简单的例子解释递归吗?类似于4个值的数组?非常感谢您的响应!