我试图了解如何使用递归函数找到最大数,但我并不真正了解如何进行。有这个代码:
#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
的结果.你可以看到模式出现了。您将返回较大者:max
或 ar[n]
对于所有其余的调用 maximum
, 当你第一次调用 maximum
时,您将比较 ar
中的所有值找到它的最大值并返回它。
还有,阿杰说的对,ar[n]
正在访问您从未在循环中初始化的值。你应该写 int max = maximum(ptr, n - 1)
在main
解决这个问题。
关于c - 如何使用递归函数找到最大数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54511381/