算法之路_4、递归思想

一、解释

先不谈递归是怎样的,我们先举个通俗易懂得栗子。

我们在上大学的时候,学校里总会统计学生竞赛等获奖人数以及奖项。而此时校方就下发命令要求各二级学院去统计各学院获奖人数,二级院校又会下发命令要求各班级去统计。各班级由学生个人汇报自己得情况,然后班级汇总交给二级学院,二级学院再汇总交给学校。这其实就是一个递归的过程。

大问题划分为小问题,小问题求解汇总,大问题汇总小问题,最终得解。

递归两个要素

1.递归边界 即递归出口

      递归必须要设置出口 不然就会变成死循环。例如 :下面阶乘得例子中当n为1时就可以直接返回。

2.递归的逻辑——递归"公式"  

      递归的过程一定有参数的变化,并且参数的变化,和递归边界有关系.

递归思想:算法中的递归函数的实质就是系统在帮我们压栈。是一种程序的自身调用,在调用过程中,每次将程序执行现场压栈,直到递归出口返回信息,再弹栈继续执行。直到栈空。

 

初学递归不容易理解,可以在大致理解思想之后多找几个初级得递归例子,打断点调试执行看看执行过程。

二、代码(这里为便于理解 代码举一个c语言课本的例子 --计算)

    //递归计算阶乘
    public static int factorial(int n){
        //递归出口 
        if(n == 1){
            return 1;
        }

        return n*factorial(n-1);  //自己调用自己
        
    }

三、递归时间复杂度分析

master公式的使用

符合复杂度分析公式  T(N) = a*T(N/b) + O(N^d)的 都可以用master公式判断时间复杂度 a为发生得次数  b为划分为几个子过程

1) log(b,a) > d -> 复杂度为O(N^log(b,a)) 

2) log(b,a) = d -> 复杂度为O(N^d * logN) 

3) log(b,a) < d -> 复杂度为O(N^d)

你可能感兴趣的:(算法之路)