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

时间:2015-12-21 15:57:01

标签: c arrays recursion min

我编写了以下程序,使用递归从数组中查找最小值元素。然而,该程序继续向我显示答案为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;
}

2 个答案:

答案 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);
}

正如有些人所指出的,您的代码有点令人困惑,因此我会发布一个更简单的代码,而不会有staticglobal个变量。如果您觉得困难,请尝试理解它并发表评论。

#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递归调用函数,下一个要检查的元素是剩余大小。