Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用递归函数求最大数_C_Recursion - Fatal编程技术网

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