20201023_081.递归函数_函数调用内存分析_栈帧的创建

递归函数

递归函数指的是:自己调用自己的函数,在函数体内部直接或间接地自己调用自己。递归类似于大家中学数学学习过的“数学归纳法”。 每个递归函数必须包含两个部分:

  1. 终止条件
    表示递归什么时候结束。一般用于返回值,不再调用自己。
  2. 递归逻辑关系
    把第 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)

运行结果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vrk1tkyO-1603465725617)(en-resource://database/7411:0)]@w=120
栈内存过程分析:
最开始执行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函数的栈空间(上面的图没画),整个程序运行完成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值