递归算法介绍
本节将主要介绍基础算法中最为常见和最为简单的算法:递归算法。
1. 递归算法原理详解
递归算法,通常是把一个大型复杂的问题,一次次通过递归调用而层层转化为一个与原问题相似的规模较小的问题来求解,基本思想是将大问题一步步化为小问题,递归算法只需少量的程序就可表达对大问题的计算过程所需要的多次重复计算,大大地减少了程序代码。从代码的角度上来看就是函数调用自身,我们称之为递归。
2. 举例说明递归算法
我们现在用一个简单的例子进行说明:假设我们需要写一个函数去求数字n
的阶乘。当输入5
时,输出5!=120
,当输入6时,输出6!=720
。如果我们编写了一个函数 F(n)
用来求解输入参数 n 的阶乘值,很明显我们可以发现这样一个递归关系:F(n) = n * F(n - 1)
,那么我们求解 F(n) 的代码可以这样写:
递归求 5 的阶乘 Python 实现
def F(n):
if n == :
return
return n * F(n - )
前两行的语句是递归终止条件,这个是必须要有的,而且必须是递归要能到达的。最后一个 n * F(n - 1)
正是递归调用自身,且每次递归的参数都会减少直到最后的终止条件结束。我们用示例图来演示下 F(5) 执行的递归过程,这样方便我们理解递归调用。
递归算法动态示意图:
从上面的示意图可以看到,递归的思想就是在不停调用本身往下执行,直到终止条件达到然后再回推结果。递归带来的好处非常明显,就是减少代码,让代码看起来简洁明了。假如我们要使用非递归算法来求解 n 的阶乘,代码如下:
def F_no_recursive(n):
s =
for i in range(, n + ):
s = s * i
return s
示意图如下:
4. 递归算法的缺点
5. 解决递归问题的通用思路
- 递归终止条件:一定和必须要有;
- 递归公式:递归的核心,找不出递归公式的,也就无法使用递归算法来解决。这里实现递归算法的递部分;
- 返回预定结果:返回我们预先定好的结果参与递归算法的归部分;
在下一节中,我们会在 LeetCode 上完成 3 道和递归相关的算法题,并使用这三个步骤去完成相关题解,也会让大家加深对这三步的理解。
6. 小结
本节在介绍了递归算法概念并对递归算法的优缺点进行了相关分析,紧接着用 leetcode 上的两道基础递归题目进行了练习和说明,帮助理解递归算法。
Tips:文中动图制作参考:https://visualgo.net/zh/sorting。