递归和master公式

递归是如何实现的

举例来说,比如我们希望求一个数组中的最大值,使用如下递归的方法

    public static int maxValue(int[] arr) {
        return f(arr, 0, arr.length - 1);
    }

    // arr[l....r]范围上的最大值
    public static int f(int[] arr, int l, int r) {
        if (l == r) {
            return arr[l];
        }
        int m = (l + r) / 2;
        int lmax = f(arr, l, m);
        int rmax = f(arr, m + 1, r);
        return Math.max(lmax, rmax);
    }

    public static void main(String[] args) {
        int[] arr = { 3, 8, 7, 6, 4, 5, 1, 2 };
        System.out.println("数组最大值 : " + maxValue(arr));
    }

每次将数组对半划分,求出对半划分两部分的最大值,取其中较大者返回

递归就是通过系统栈来实现的,函数调用时,系统会将函数及其局部变量入栈,而到达递归的base case(即递归终止条件时),将结果返回给栈顶函数,此时需回复栈顶函数,继续执行。
递归的实现
画递归调用图可以帮助我们更好的理解递归,递归调用图类似于树的形式
递归调用图

由于递归的调用就是通过栈来实现的,我们也可以不使用系统栈,而自己将递归的中间结果压入栈,因此,任何递归都可以改为非递归实现。递归改成非递归的必要性:
1)工程上几乎一定要改,除非确定数据量再大递归也一定不深,如归并排序、快速排序、线段树、很多的平衡树等;
2)算法笔试或者比赛中(能通过就不改)

master公式

首先给出公式T(N)=a*T(N/b)+O(n^c),a,b,c都是常数
以上面的代码为例,解释这个公式的使用

    public static int maxValue(int[] arr) {
        return f(arr, 0, arr.length - 1);
    }

    // arr[l....r]范围上的最大值
    public static int f(int[] arr, int l, int r) {
        if (l == r) {
            return arr[l];
        }
        int m = (l + r) / 2;
        int lmax = f(arr, l, m);
        int rmax = f(arr, m + 1, r);
        return Math.max(lmax, rmax);
    }

    public static void main(String[] args) {
        int[] arr = { 3, 8, 7, 6, 4, 5, 1, 2 };
        System.out.println("数组最大值 : " + maxValue(arr));
    }

f为递归函数,其内部对自身有两次调用,即lmax=f(arr,l,m)和rmax=f(arr,m+1,r),故a=2。而由于是每次将数组对半划分,再调用f,因此b=2。f函数内部的操作都是时间复杂度为O(1)的操作,因此c=0。因此我们求出了a=2,b=2,c=0,再来就可直接得出时间复杂度

master公式时间复杂度
logba=1>c,因此时间复杂度为O(n)。
注意:master公式只能估计子问题等规模的递归。
此外,
补充情况

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

推荐阅读更多精彩内容

  • 导论  小编之前在分享有关的算法时,把递归这一重要的算法设计思想给遗漏了。递归的学习绝对是一个持久战,没有人可以一...
    ITsCLG阅读 8,652评论 1 5
  • 前言 递归是算法中一种非常重要的思想,应用也很广,小到阶乘,再在工作中用到的比如统计文件夹大小,大到 Google...
    风平浪静如码阅读 290评论 0 0
  • 前言 递归是算法中一种非常重要的思想,应用也很广,小到阶乘,再在工作中用到的比如统计文件夹大小,大到 Google...
    谢kun阅读 8,172评论 0 15
  • 2.3 递归 概述 定义 计算机科学中,递归是一种解决计算问题的方法,其中解决方案取决于同一类问题的更小子集 In...
    康小庄阅读 268评论 0 1
  • 从广义上来讲:数据结构就是一组数据的存储结构 , 算法就是操作数据的方法数据结构是为算法服务的,算法是要作用在特定...
    冰风v落叶阅读 2,843评论 0 6