分治递归顺序 解析

如有错误,希望各位同学指正
本文参考《算法: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。其他的值也是这样比较

你可能感兴趣的:(分治递归顺序 解析)