繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM