使用递归查找数组的最小元素

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 一个更简单的代码,没有 staticglobal 变量。请尝试理解它,如果您觉得困难,请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 的所有元素,通过指针 pint 在每次递归调用时递增,大小递减。

正在使用当前最小值、下一个要检查的元素、剩余大小递归调用的函数。