eetCode刷题-递归篇
递归是算法学习中很基本也很常用的一种方法,但是对于初学者来说比较难以理解(PS:难点在于不断调用自身,产生多个返回值,理不清其返回值的具体顺序,以及最终的返回值到底是哪一个?)。因此,本文将选择LeetCode中一些比较经典的习题,通过简单测试实例,具体讲解递归的实现原理。本文要讲的内容包括以下几点: 理解递归的运行原理 求解递归算法的时间复杂度和空间复杂度 如何把递归用到解题中(寻找递推关系,或者递推公式) 记忆化操作 尾递归 剪枝操作 理解递归的运行原理 例1求解斐波那契数列 题目描述(题目序号:509,困难等级:简单): 求解代码(基础版): class Solution { public int fib(int N) { if(N <= 1) return N; return fib(N - 1) + fib(N - 2); } } 现在以N = 5为例,分析上述代码的运行原理,具体如下图: 递归的返回值很多,初学者很难理解最终的返回值是哪个,此时可以采用上图的方式画一个树形图,手动执行递归代码,树形图的叶节点即为递归的终止条件,树形图的根节点即为最终的返回值。树形图的所有节点个数即为递归程序得到最终返回值的总体运行次数,可以借此计算时间复杂度,这个问题会在后文讲解。 例2 二叉树的三种遍历方式 二叉树的遍历方式一般有四种:前序遍历、中序遍历、后序遍历和层次遍历