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))
中,重复执行第一个调用,直到使用数组的单个元素进行调用为止。然后比较这两个元素并返回最大值。然后继续此比较过程,直到返回最大的元素这是C++,没有特定的编程语言。我只是想理解这个方法/函数/伪代码背后的概念。我有Java背景。在Java中,您可能不会使用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个值的数组?非常感谢您的响应!