//整数序列a1,a2,a3,….,an,给出求解最大值的递归程序

来源:百度知道 编辑:UC知道 时间:2024/05/17 01:51:48
//整数序列a1,a2,a3,….,an,给出求解最大值的递归程序
#include"stdio.h"
#define N 10
int max(int a[],int len){
int m;

if(len==1) return a[0];
m=max(a+1,len-1);
if(m<a[0]) m=a[0];
return m;
}
void main()
{int arry[N],i,k;
for(i=0;i<N;i++)
scanf("%d",&arry[i]);
k=max(arry,N);
printf("%d",k);
}
请帮我解释一下,好的追加分,,
解释max()的关键部分就可以了,递归很难明白请高手详细点
详细是重点。。不然。。。

int max(int a[],int len){//a为数组,len表示长度
int m;//定义m,表示最大值(结果)

if(len==1) return a[0];//如果只有一个元素,那么返回这个元素(即最大值)
m=max(a+1,len-1);//否则,令m等于除了第一个元素以外的最大元素
if(m<a[0]) m=a[0];//如果m<a[0],让m等于a[0],这就是求两个数最大值
return m;//返回m
}

比如数组arr[3]={2,3,1};

调用max(arr,3);

是这样的的:
调用max(arr,3)
由于len=3>1所以求arr[0]和max(arr+1,2)【就是后两个元素的最大值】的最大值

调用max(arr+1,2)
由于len=2>1所以求(arr+1)[0]【就是原来的arr[1]】和max(arr+2,1)的最大值

调用max(arr+2,1)
由于len=1,所以返回(arr+2)[0]【就是原来的arr[2],等于1】。

回到max(arr+1,2)中,已经知道(arr+1)[0]=3,而max(arr+2,1)刚才返回1,
3和1的最大值是3,返回3

回到max(arr,3)中,已经知道arr[0]=2,而max(arr+1,2)刚才返回3,
2和3的最大值是3,返回3

所以运行结果为3

这个程序是线性选择算法,其实,这个算法在k比较小的时候(这里就是1了),已经退化为堆排序,而这道题,其实说是线性查找也没问题。