1

我想使用递归找到数组的最大和最小元素。这是我编写的程序,我已经完成了逻辑,它似乎很完美。但是当我编译程序时,程序在输入后卡住了。

这是我的程序:

#include<stdio.h>
#include<conio.h>

int max(int a[], int n);
int min(int a[], int n);

void main(){
    int a[100],n,i,maxi,mini;
    clrscr();
    printf("Enter the number of elements ");
    scanf("%d",&n);
    printf("Enter the elements of array ");
    for(i=0;i<n;i++)
    {
        scanf("%d \n",&a[i]);
    }
    maxi = max(a,n);
    mini = min(a,n);
    printf("\nMaximum element : %d",maxi);
    printf("\nMinimum element : %d",mini);
    getch();
}

int max(int a[],int n){
    int maxo=0,i=0;
    if(i<n){
        if(maxo < a[i]){
           maxo=a[i];
        }
        i++;
        max(a,n);
    }
    return maxo;
}

int min(int a[],int n){
    int mino=999,i=0;
    if(i<n){
        if(mino > a[i]){
            mino=a[i];
        }
        i++;
        min(a,n);
    }
    return mino;
}
4

2 回答 2

5

你的函数maxmin导致无限递归。这会导致堆栈溢出。

你有:

int max(int a[],int n){
   int maxo=0,i=0;
   if(i<n){
      if(maxo < a[i]){
         maxo=a[i];
      }
      i++;
      max(a,n);
   }
   return maxo;
}

使用递归方法的麻烦在于在每个递归调用中都i初始化为。0您正在使用的事实i++不会影响i下一次递归调用中的值。类似地,在每个递归调用中的值maxo都设置为。0

要使递归函数工作,您需要传递i和传入maxo递归函数调用。就像是:

int max(int a[],int n, int i, int maxo){
   if(i<n){
      if(maxo < a[i]){
         maxo=a[i];
      }
      return max(a, n, i+1, maxo);
   }
   return maxo;
}

并使用以下命令调用该函数:

maxi = max(a, n, 0, a[0]);

min对 的定义和对 的调用进行类似的更改min

于 2015-08-25T18:30:05.607 回答
2

代码无限递归

对 OP 的代码进行了 2 处更改

#include <limits.h>

int max(int a[],int n){
    //int maxo=0,i=0;
    int maxo=INT_MIN,i=0;  // Initialize maxo to the minimum int
    if(i<n){
        if(maxo < a[i]){
           maxo=a[i];
        }
        i++;
        // max(a,n);  
        // go to next element in the array, decrement array size. 
        // Without eventually reducing the array size, code recurses indefinitely.
        // So here max() works on a 1 smaller array.
        int m = max(a+1,n-1);  
        // save the greater one
        if (m > maxo) maxo = m;
    }
    return maxo;
}

当循环更好时使用递归会给递归带来不好的名字。考虑以下将每次调用的数组大小减半的情况。最后还有关于n调用的max(),只是递归深度只是log2(n)而不是n

int find_max(const int *a, size_t n) {
  if (n <= 1) {
    return (n == 0) ? INT_MIN : a[0];
  }
  int left = find_max(a, n/2);
  int right = find_max(&a[n/2], n - n/2);
  return left > right ? left : right;
}
于 2015-08-25T18:35:10.123 回答