分治递归顺序 解析

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 分治策略 本文包括分治的基本概念二分查找快速排序归并排序找出伪币棋盘覆盖最大子数组 源码链接:https://gi...
    廖少少阅读 5,876评论 0 7
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,349评论 0 33
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,930评论 18 399
  • 身边人,自称“吃货”的很多,敢称 “美食家”的却寥寥无几。身边人“会吃”的众多,“会写吃”的寥寥无几。 在江南...
    关月央阅读 3,146评论 0 0
  • 老公不知哪里弄的两条小女孩的裙子,忍不住给儿子穿上看看,有没有很美,其实有个女儿也挺好,可以给她穿那么多花花绿绿的...
    给给阅读 4,744评论 2 0