双阶乘是什么 2n的阶乘公式是什么
前言
递归是算法中一种非常重要的思想,其应用广泛,小到阶乘问题,大到文件夹大小统计、Google的PageRank算法都能看到递归的身影,也是面试官很喜欢的考点。
递归算法的核心在于将问题拆解成相同解决思路的子问题,子问题再拆解成更细的子子问题,直到解的子问题无需再拆分,即有了终止条件。解决递归问题的基本套路也相对固定,下面我们将从几个方面来详细讲解递归。
- 什么是递归?
- 递归算法通用解决思路
- 实战演练(从初级到高阶)
力争让大家对递归的认知能上一个新台阶,特别会对递归的时间复杂度作详细剖析,总结一套求解递归时间复杂度的套路。
一、什么是递归
简单地说,就是在函数中存在着调用函数本身的情况,这种现象就叫递归。
以阶乘函数为例,如下:在factorial函数中存在着factorial(n-1)的调用,所以此函数是递归函数。
递归的本质是把问题拆分成具有相同解决思路的子问题,直到最后解的子问题再也不能拆分,即有了基本情况(或称终止条件)。在递归的过程中自然地解决了最初的问题。
二、递归算法通用解决思路
要解决一个递归问题,首先需要根据递归的两个特点来判断题目是否可用递归来解。
- 问题可以分解成具有相同解决思路的子问题。
- 经过层层分解的子问题最后一定有一个或多个固定值的终止条件。
如果满足以上两个特点,那么我们就可以考虑使用递归来解决这个问题。接下来就是递归解题的基本套路:
- 先定义一个函数,明确这个函数的功能。
- 寻找问题与子问题间的关系(即递推公式)。
- 将递推公式用代码表示出来。
- 求出时间复杂度,如果发现递归时间复杂度不可接受,则需要转换思路,寻找更靠谱的解法。
三、实战演练(从初级到高阶)
热身赛:计算阶乘
套用上面说的递归四步解题套路来看怎么解。
- 定义函数并明确功能:计算n的阶乘。
- 寻找问题与子问题的关系:阶乘的关系比较简单,即f(n) = n f(n-1),同时有f(1)=1这个终止条件。
- 将递推公式用代码表示出来。
- 求时间复杂度:由于每次计算都要进行乘法操作,所以时间复杂度是O(n)。
总结
大部分递归题都有固定的解题思路和步骤,只要掌握了这些步骤和思路,再复杂的递归题也能轻松解决。要注意递归虽然强大,但时间复杂度往往很高,需要合理使用空间换时间的策略来优化算法。多练习、多思考,相信大家都能掌握递归算法的精髓。