c - 如何使用递归函数找到最大数

标签 c recursion

我试图了解如何使用递归函数找到最大数,但我并不真正了解如何进行。有这个代码:

#include <stdio.h>
#include <stdlib.h>
int main()
{

    int ar[100],n,i;
    int *ptr;
    printf("Enter size of the list:");
    scanf("%d", &n);
    printf("Printing the list:\n");
    for (i = 0; i < n ; i++)
    {
        scanf("%d", &ar[i]);
    }
    ptr=&ar;
    int max=maximum(ptr,n);
    printf("ma %d",max);
    return 0;
}
int maximum(int ar[], int n)
{

    int max;
    if(n+1==1)
    {
        return ar[n];
    }
    max =maximum(ar,n-1);
    return ar[n]>max?ar[n]:max;
}

它实际上在做什么以及如何做? 使用指针指向整数数组是否正确? 我希望你能帮助我理解它!

最佳答案

您使用 int ar[100] 为 100 个整数的数组预留内存, 然后输入 n这是使用 scanf("%d", &n) 设置的.如果您在此阶段输入大于 100 的数字,您的程序将出现段错误,因为您的循环 for (i = 0; i < n ; i++)将尝试访问 ar[100]这是内存访问错误(可用的最高数组索引是 ar[100 - 1] ,请注意 100 - 1 < 100)。不管怎样,你填n ar 的索引在循环。 ptr = &ar只是分配ar的起始地址至 ptr .顺便ptr = ar也可以,&没有必要。现在你可以使用 ptr与您使用 ar 的方式相同.

理解递归最简单的方法是直接看maximum的最后一次调用。 .但首先,了解您通过了 ptr到与传递 ar 相同的函数(请记住,自 main 以来,它们在 ptr = ar 中是相同的。)

所以在最后一次调用maximum , 当n + 1 == 1 (与 n == 0 相同),它返回 ar[n]这是ar[0] ,首先是您为 'Printing the list' 输入的数字(它存储在 ar[0] 中)。

现在是倒数第二个 maximum , n + 1 == 1是错误的,因为 n = 1所以我们去max = maximum(ar, n - 1) .这是最后一次调用 maximum 的结果我刚刚解释过,所以max的值为 ar[0] .现在你有 return ar[n] > max ? ar[n] : max ,与 return ar[1] > ar[0] ? ar[1] : ar[0] 相同.这和

是一样的
if (ar[1] > ar[0]) {
  return ar[1];
} else {
  return ar[0];
}

你可以看到这会返回较大的一个,ar[0]ar[1] .现在是倒数第三次调用 maximum , max是最后第二次调用 maximum 的结果.你可以看到模式出现了。您将返回较大者:maxar[n]对于所有其余的调用 maximum , 当你第一次调用 maximum 时,您将比较 ar 中的所有值找到它的最大值并返回它。

还有,阿杰说的对,ar[n]正在访问您从未在循环中初始化的值。你应该写 int max = maximum(ptr, n - 1)main解决这个问题。

关于c - 如何使用递归函数找到最大数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54511381/

相关文章:

c - 如何在 unix/posix 中清除(重置)屏幕? (不是诅咒/换行符)

c - 为什么c中条件运算符第二部分的赋值需要括号

java - 在乘法中使用递归

algorithm - [InterviewBit]两个整数的幂

c - 字符串数组,并打印这些元素

c - 在C中,这行代码做什么:

python - Python中的最大递归级别

c++ - 这个递归函数是如何自动转化为迭代函数的呢?

algorithm - 递归函数转化为非递归函数

c - '&'标记之前的语法错误