在运行时,max从数字列表中给出所需的最大数量,但是min没有给出它应该给出的最小数量。 例如:
如果输入为:
5
45 7 2 1 4
以下代码的输出是:
最大数量为45
最小数量为0
为什么?
#include <stdio.h>
#include <limits.h>
#define MX 1000000
int max=INT_MIN;
int min=INT_MAX;
int findmax(int a[],int n)
{
if(n<0)
return max;
if(a[n]>max)
{
max=a[n];
}
return findmax(a,n-1);
}
int findmin(int a[],int n)
{
if(n<0)
return min;
if(a[n]<min)
{
min=a[n];
}
return findmin(a,n-1);
}
int main(void) {
int a[MX],n,i;
printf("Enter the number of elements:\n");
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
printf("Maximum number is %d\n",findmax(a,n));
printf("Minimum number is %d\n",findmin(a,n));
return 0;
}
答案 0 :(得分:5)
在您的代码中,您将索引0的值初始化为n-1
,但在findmax()
和findmin()
内,你是&#39 ;重新使用索引n
。该值未初始化为任何值(a
是自动局部变量,还记得吗?),以及该指数(内容)中的值是不确定的。
因此,使用该索引访问实际上是尝试读取调用undefined behaviour的单元化变量。
以findmax()
作为第二个参数拨打findmin()
和n-1
。
答案 1 :(得分:0)
您需要从n-1而不是从n迭代数组元素。因此,以这种方式调用函数 findmax(a,n-1) findmin(a,n-1)
答案 2 :(得分:0)
使用全局变量不被认为是一个好的设计。如果您不痴迷于递归函数,可以将代码简化为
int findmax(int a[], int n) {
int i = 0, max = INT_MIN;
for (; i < n; ++i)
if (max < a[i])
max = a[i];
return max;
}
同样适用于findmin
。