C 如何使用递归函数求最大数
我试图理解如何使用递归函数找到最大数,但我并不真正理解如何。有此代码:C 如何使用递归函数求最大数,c,recursion,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
#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 main()
{
int-ar[100],n,i;
int*ptr;
printf(“输入列表的大小:”);
scanf(“%d”和“&n”);
printf(“打印列表:\n”);
对于(i=0;imax?ar[n]:max;
}
它实际上在做什么,如何做?
使用指针指向整数数组是否正确?
我希望你能帮助我理解它 要了解
maximum
的工作原理,只需尝试在maximum
函数中找到一些不变量
int maximum(int ar[], int n)
{
int max;
if(n==0)
{
return ar[n];
}
max =maximum(ar,n-1);
/* at this point MAX keeps the maximum of the subarray [0..N-1] and using this
we try to get by induction the maximum of [1..N]. */
return ar[n]>max?ar[n]:max;
}
要了解
maximum
的工作原理,只需尝试在maximum
函数中找到一些不变量
int maximum(int ar[], int n)
{
int max;
if(n==0)
{
return ar[n];
}
max =maximum(ar,n-1);
/* at this point MAX keeps the maximum of the subarray [0..N-1] and using this
we try to get by induction the maximum of [1..N]. */
return ar[n]>max?ar[n]:max;
}
使用
int-ar[100]
为100个整数的数组留出内存,然后输入n
,该值是使用scanf(“%d”、&n)
设置的。如果在此阶段输入大于100的数字,程序将seg fault,因为(i=0;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]
,这是您为'打印列表'
输入的第一个数字(它存储在ar[0]
)
现在在对maximum
的第二个最后调用中,n+1==1
为false,因为n=1
所以我们转到max=maximum(ar,n-1)
。这是我刚才解释的上次调用max
的结果,因此max
的值为ar[0]
。现在您有了返回ar[n]>max?ar[n]:max
,与返回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]
对于max
的所有其余调用,当您第一次调用max
时,您将比较ar
中的所有值以找到其最大值并返回它
此外,Ajay所说的是正确的,
ar[n]
正在访问一个在循环中从未初始化过的值。您应该在main
中写入int max=maximum(ptr,n-1)
来解决这个问题。您为一个包含100个整数的数组留出内存,该数组使用int ar[100]
,然后输入n
,该数组是使用scanf(“%d”、&n)设置的。
。如果在此阶段输入大于100的数字,程序将seg fault,因为(i=0;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]
,这是您为'打印列表'
输入的第一个数字(它存储在ar[0]
)
现在在对maximum
的第二个最后调用中,n+1==1
为false,因为n=1
所以我们转到max=maximum(ar,n-1)
。这是我刚才解释的上次调用max
的结果,因此max
的值为ar[0]
。现在您有了返回ar[n]>max?ar[n]:max
,与返回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]
,用于对max
的所有其余调用,并在
% gcc -O2 -pedantic -Wall m.c
% ./a.out
Enter size of the list: 3
3
1
2
max = 3
% ( echo 100000000 ; yes 1 ) | ./a.out
Enter size of the list: max = 1
% gcc -pedantic -Wall m.c
% ( echo 100000000 ; yes 1 ) | ./a.out
Enter size of the list: Segmentation fault