递归是一个让人又爱又恨的算法,为什么这么说呢?如果理解递归的话,就会觉得这代码写的真简洁,而且简答易懂,对于不理解递归的人来说,这是什么啊?天书?我怎么推导不出来结果是什么?
对于视性能如命的人来说,他们不愿意用递归,因为循环的性能比递归更好。正如Leigh Caldwell说过一句话:“如果使用循环,程序的性能可能更高;如果使用递归,程序可能更容易理解。如何选择要看什么对你来说更重要。”
很多算法都用了递归,所以理解递归的概念很重要。
废话就说到这里,下面开始正式介绍递归。
递归,说白了就是运行过程中调用自己。举个最简单的例子,我们都会使用电脑,在电脑里都存在文件系统,文件系统包括了文件夹和文件。文件夹里包含文件,也可以再包含文件夹,里面的文件夹又包含文件或文件夹......无限制的循环下去。如果有个需求:需要查询一下某个目录下的所有文件及文件夹,这时如果使用循环的话,你可能就觉得有些棘手。因为不知道具体有基层目录,所以for循环不知道要写几次,这是递归就可以很好的解决这个问题。
编写递归时,一定要注意基线条件和递归条件,否则,没有设置基线条件的话,递归程序可能会成为无线循环执行程序。
举个简单的例子,我们实现一个数字的递归输出:
def countNum(i): #数数字,数字递归
print(i)
countNum(i-1)
countNum(9)
输出结果为
9
8
7
6
5
4
3
2
1
0
-1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-11
-12
-13
-14
-15
-16
-17
... ... 以下内容省略,因为无休止的执行下去
def countNum(i):
if i > 0: # 加个基线条件,程序变不会无休止的执行
print(i)
countNum(i-1)
countNum(9)
下面的程序对递归加了基线条件后,程序在i =0的时候终止。