【问题标题】:finding minimum element of array using recursion使用递归找到数组的最小元素
【发布时间】:2016-03-27 18:15:41
【问题描述】:

我编写了以下程序来使用递归从数组中找到最小值元素。但是程序不断向我显示答案为 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 == 0)。如果您认为这种情况未定义(assert 在这里可能很好),您可以定义单例数组的最小值(即size == 1)是唯一的元素。否则,它是第一个数组元素的较小值和数组其余部分的最小值。

标签: c arrays recursion min


【解决方案1】:

您没有设置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);

正如 cmets 中所讨论的,您的代码中还有另一个错误。您忽略了 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;

}

【讨论】:

  • @hacks,你说的是max-min这个东西吗?
  • 我说的是getminElement函数。
  • @Haris;查看getminElement 函数中的语句getminElement(a);。它的返回类型是int
  • getminElement(a); 中,该递归返回的值被忽略。
  • @CoolGuy,是的,但不应忽略,我同意黑客攻击。
【解决方案2】:

另一个递归版本

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 递增在每次递归调用时,大小都会递减。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-16
    • 2020-07-03
    • 2015-11-19
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    相关资源
    最近更新 更多