以递归方式查找数组的最大元素

时间:2013-01-19 14:13:56

标签: c recursion

我有这个功能:

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块中这两行。

4 个答案:

答案 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)

enter image description here

很抱歉图表格式不佳