使用递归查找数组的最小元素
finding minimum element of array using recursion
我编写了以下程序以使用递归从数组中查找最小值元素。但是程序一直显示答案为 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;
}
您没有设置 size
变量。由于 size
是一个全局变量,它会自动初始化为 0
.
所以当第一次达到这个条件时
if(i < size)
它失败了,因此 returning 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
块内函数调用的 return 值。
您应该使用它来 return 将值返回给调用函数。像,
if(i < size)
{
if(min > a[i])
min=a[i];
i++;
return getminElement(a);
}
正如一些人所指出的,您的代码有点混乱,所以我将 post 一个更简单的代码,没有 static
和 global
变量。请尝试理解它,如果您觉得困难,请post发表评论。
#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;
}
另一个递归版本
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 中的最小值 >= 1000,正如您所做的那样。
此处 getminElement 函数检查 a 的所有元素,通过指针 p 到int 在每次递归调用时递增,大小递减。
正在使用当前最小值、下一个要检查的元素、剩余大小递归调用的函数。
我编写了以下程序以使用递归从数组中查找最小值元素。但是程序一直显示答案为 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;
}
您没有设置 size
变量。由于 size
是一个全局变量,它会自动初始化为 0
.
所以当第一次达到这个条件时
if(i < size)
它失败了,因此 returning 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
块内函数调用的 return 值。
您应该使用它来 return 将值返回给调用函数。像,
if(i < size)
{
if(min > a[i])
min=a[i];
i++;
return getminElement(a);
}
正如一些人所指出的,您的代码有点混乱,所以我将 post 一个更简单的代码,没有 static
和 global
变量。请尝试理解它,如果您觉得困难,请post发表评论。
#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;
}
另一个递归版本
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 中的最小值 >= 1000,正如您所做的那样。
此处 getminElement 函数检查 a 的所有元素,通过指针 p 到int 在每次递归调用时递增,大小递减。
正在使用当前最小值、下一个要检查的元素、剩余大小递归调用的函数。