问题提出:求数组A={1,5,7,22,9}中的最大值。这种递归非常绕,需要简化来看,比如拿只含两个元素的数组带进去观察。如A={12,25},把问题简化到最简单。
/*-------完整代码(修改简化)@映雪--------*/#includeusing 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="< <
另一种精简的算法,来源于《算法: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;}