我编写了以下程序,使用递归从数组中查找最小值元素。然而,该程序继续向我显示答案为1000
#include<stdio.h>
#define MAX 100
int getminElement(int []);
int size;
int main(){
int min;
int i;
int a[10]={12,6,-24,78,43,3,22,45,40};
min=getminElement(a);
printf("Smallest element of an array is: %d",min);
return 0;
}
int getminElement(int a[]){
static int i=0,min =1000;
if(i < size){
if(min > a[i])
min=a[i];
i++;
getminElement(a);
}
return min;
}
答案 0 :(得分:6)
您没有设置size
变量。由于size
是一个全局变量,因此它会自动初始化为0
。
所以第一次达到这个条件时
if(i < size)
失败,因此返回min
,即1000
执行以下操作
int max;
int i;
int a[10]={12,6,-24,78,43,3,22,45,40};
size = 10;
或者,为了让它变得更好。
int max;
int i;
int a[10]={12,6,-24,78,43,3,22,45,40};
size = sizeof(a)/sizeof(int);
正如评论中所讨论的,代码中还有另一个错误。您忽略if
块内函数调用的返回值。
您应该使用它将值返回给调用函数。像,
if(i < size)
{
if(min > a[i])
min=a[i];
i++;
return getminElement(a);
}
正如有些人所指出的,您的代码有点令人困惑,因此我会发布一个更简单的代码,而不会有static
和global
个变量。如果您觉得困难,请尝试理解它并发表评论。
#include<stdio.h>
#define MAX 100
int getminElement(int [], int, int);
int main()
{
int min;
int i;
int a[10]={12,6,-24,78,43,3,22,45,-40};
printf("Smallest element of an array is: %d", getminElement(a, 0, sizeof(a)/sizeof(int)));
return 0;
}
int getminElement(int a[], int index, int size)
{
int min = 9999;
if(index < size)
min = getminElement(a, index + 1, size);
if(a[index] < min)
return a[index];
else
return min;
}
答案 1 :(得分:1)
另一个递归版
int getminElement(int min, int *p, int size) {
if (*p < min) min = *p; // set min to minimum(*p, min)
if (size < 1) return min; // no more elements to see, return min
return getminElement(min, p+1, size-1); // recursive call
}
称为
int numelem = sizeof(a) / sizeof(*a);
int minimum = getminElement(1000, a, numelem);
假设 a 中的最小值>&gt; = 1000,就像你一样。
此处 getminElement 函数检查 a 的所有元素,通过指针 p 到 int 递增在每次递归调用时,大小都会递减。
使用当前min递归调用函数,下一个要检查的元素是剩余大小。