我有这个功能:
int max(int arr[], int size)
{
size--;
if(size > 0)
{
int max = max(arr, size);
if(arr[max] > arr[size]) return max;
}
return size;
}
当然有效。我的问题是 - 这是如何工作的?任何人都可以一步一步解释我吗?这是星期六所以也许有人有一点时间:D我特别是在if块中这两行。
答案 0 :(得分:2)
我们以此数组为例:
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 :(得分:2)
您的代码如下:
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
以提高清晰度。
答案 2 :(得分:2)
让我们逐步解决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
}
答案 3 :(得分:2)
很抱歉图表格式不佳