如有错误,希望各位同学指正
本文参考《算法:C语言实现 (1-4)》
递归的两个条件:
1 解决数学归纳
2 自身调用自己,需要结束条件
下面是一个简单的分治递归程序,用来获取数组中最大的值
public static int max(int[] a, int l, int r){
int right = 0;
int left = 0;
int m = (r + l)/2;
if(l == r){ //1
//结束条件 这个是划分到 左右两个值相等的时候 返回当前的值
return a[l];
}
left = max(a, l, m);
right = max(a, m + 1, r);
//比较划分后 左右两边值的大小 并返回给 left和right
if(right > left){
return right;
}
else{
return left;
}
}
public static void main(String[] args) {
int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
System.out.println(max(a, 0, 10));
}
左边的执行顺序(右边的顺序类似)
max(0, 10)
max(0, 5)
max(0, 2)
max(0, 1)
max(0, 0)
max(1, 1)
max(2, 2)
max(3, 5)
max(3, 4)
max(3, 3)
max(4, 4)
max(5, 5)
max(6, 10)
需要注意的是 :
类似 max(x, x) 也就是2个数相等的地方,因为这个会执行到 标有1的地方,然后就会给left或者right赋值为a[x]。
首先分析一下分治递归的执行顺序
分治法是划分左右两边,每次都是先执行完左边然后再执行右边
1> 按上面的顺序执行到max(0, 0) (就是给left赋值为a[0])和max(1, 1)(给right赋值为a[1])
2> 然后left和right都有值之后就会往下比较2个值的大小 并把返回值(a[0]和a[1]中较大的值)赋值给left
3> 再然后执行max(2, 2)给right赋值为a[2]并赋值给right,然后比较left和right大小,较大值赋值给left。其他的值也是这样比较