使用递归查找数组的最小和最大元素的程序
program to find minimum and maximum element of array using recursion
我想使用递归查找数组的最大和最小元素。
这是我写的程序,我已经检查了逻辑,它看起来很完美。但是当我编译程序时,程序在接受输入后卡住了。
这是我的程序:
#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;
}
您的函数 max
和 min
导致无限递归。这会导致堆栈溢出。
你有:
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
的调用进行类似的更改。
代码无限递归
对 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;
}
我想使用递归查找数组的最大和最小元素。 这是我写的程序,我已经检查了逻辑,它看起来很完美。但是当我编译程序时,程序在接受输入后卡住了。
这是我的程序:
#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;
}
您的函数 max
和 min
导致无限递归。这会导致堆栈溢出。
你有:
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
的调用进行类似的更改。
代码无限递归
对 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;
}