递归函数
递归函数指的是:自己调用自己的函数,在函数体内部直接或间接地自己调用自己。递归类似于大家中学数学学习过的“数学归纳法”。 每个递归函数必须包含两个部分:
- 终止条件
表示递归什么时候结束。一般用于返回值,不再调用自己。 - 递归逻辑关系
把第 n 步的值和第 n-1 步相关联。
注意:递归函数会在栈中创建大量的函数对象,过量的消耗内存和运算能力,在处理大量数据时慎用。
【案例】
def test(n):
print('test{}begin'.format(n))
if n == 1:
print(1)
else:
test(n - 1)
print('test{}finished'.format(n))
test(3)
运行结果:
栈内存过程分析:
最开始执行test(3),在test(3)函数里一行一行运行,过程中打印了结果的第1行:“test3begin”,判断完n不=1,–>else: ,马上要执行下一条代码,栈里是这样的
所以运行test(2),这时test(3)还没运行完。在tes(2)函数里一行一行运行,过程中打印了结果的第2行:“test2begin”,判断完n不=1,–>else: ,马上要执行下一条代码,栈里是这样的
同理,运行test(1),这时test(3)、test(2)还没运行完。栈里是这样
然后就在test(1)函数里一行一行运行,
–>打印结果的第3行:“test1begin”,
–>判断n=1,打印结果的第4行:“1”,else的不执行了
–>打印结果的第5行:“test1finished”
然后test(1)就运行完了,test(1)占用的栈空间释放掉,栈里变成了这样
然后继续运行test(2)中剩下的代码,打印结果的第6行:“test2finished”,打印完后,test(2)运行完,test(2)占用的栈空间释放,栈里变成了这样
同理,接下来继续运行test(3)中剩下的代码,打印结果的最后一行,第7行:“test1finished”,打印完,test(3)也会运行完,释放栈空间。接下来还会释放掉定义test函数的栈空间(上面的图没画),整个程序运行完成。