问题提出:求数组A={1,5,7,22,9}中的最大值。
这种递归非常绕,需要简化来看,比如拿只含两个元素的数组带进去观察。如A={12,25},把问题简化到最简单。
/*-------完整代码(修改简化)@映雪--------*/ #include <iostream> using namespace std; #define max(a,b) (((a) > (b)) ? (a) : (b)) void Max(int a[], int l, int r, int & max) { if(l == r) /*叶子只有一个元素*/ { max = a[l] ; return ; } if(l + 1 == r) /*叶子有两个元素*/ { max=a[l]>=a[r]?a[l]:a[r]; return ; } int m = (l + r) / 2 ; /*中点*/ int lmax ; /* 左半部份最大值*/ Max(a, l, m, lmax) ; int rmax;/* 右半部份最大值*/ Max(a, m + 1, r, rmax) ; max = max(lmax, rmax) ; /*最终的最大值*/ } int main() { int max; int a[]={1,5,7,23,78,55,789,342};/*自由修改*/ Max(a,0,sizeof(a)/sizeof(int)-1,max); cout<<"Max="<<max<<endl; return 0; }
另一种精简的算法,来源于《算法:C语言实现》117页
这种思路简化说明:把一个数组不停的二分对切,只到不能再切为止(切到只有一个元素时),再回溯比较。
int max(int a[],int l,int r) { int u,v,m=(l+r)/2; if(l==r) return a[l]; u=max(a,l,m); v=max(a,m+1,r); return u>v ? u : v; }