[英]Find maximal element of an array recursively
我有这个功能:
int max(int arr[], int size)
{
size--;
if(size > 0)
{
int max = max(arr, size);
if(arr[max] > arr[size]) return max;
}
return size;
}
当然它有效。 我的问题是 - 这是如何工作的? 任何人都可以一步一步解释我吗? 这是星期六,所以也许有人有一点时间:DI尤其是if block中的这两行。
我们以此数组为例:
int arr[] = { 42, 54, 23 };
max(arr, 3);
此功能通过检查当前元素的最大值与所有先前元素的最大值来工作。 以下是堆栈调用的表示:
max(arr, 3)
max(arr, 2)
max(arr, 1)
return 0
arr[0] (arr[max] = 42) <= arr[0] (arr[size] = 42) => return size (0)
arr[0] (arr[max] = 42) <= arr[1] (arr[size] = 54) => return size (1)
arr[1] (arr[max] = 54) > arr[2] (arr[size] = 23) => return max (1)
注意:将变量和具有相同标识符的函数命名为一个坏主意。
你的代码如下:
1 int max(int arr[], int size){
2 size--;
3 if(size > 0){
4 int max = max(arr, size);
5 if(arr[max] > arr[size]) return max;
6 }
7 return size;
8 }
您可以通过传递数组和该数组的大小(或长度)来调用它。
代码命中的第一个重要点是第4行,当它以递归方式调用自身时。 但请注意,在第2行,大小减少了一个。 因此,您可以将size视为一个索引,引用当前对该函数的调用所考虑的数组元素。
这意味着最终,数组的大小将降至零,我们将查看数组的第一个元素。 此时跳过第3行到第6行,返回0。
当其中一个递归调用返回时,我们将被留在第4行。
对于第一次返回,这意味着int max = 0;
。
现在我们将第0个元素与第一个元素进行比较。 我们返回更大的索引。 下一个比较将在第二个元素和前两个元素中较大者之间进行比较。
这将继续,直到返回所有递归调用,此时最大元素的索引将返回给调用函数。
那么请注意, return size;
应该用return 0
替换以增加清晰度。
让我们逐步解决arr[] = [1,2]
的问题,这意味着调用max(arr[], 2)
size--; // 2-1 = 1
if(size > 0) //True
{
int max = max(arr, size); //Going into the recursive call
这是递归运行:
size--; // Now 1-1 = 0
if(size > 0) //False
return size; //0 returned
现在回到调用函数:
int max = 0 //From return
if(arr[max] > arr[size]) //arr[0]>arr[1] which is false
}
return size; //Now, control reaches here and 1 is passed back to the calling scope
}
很抱歉图表格式不佳
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.