c++调用栈库函数_算法丨递归调用栈

9d8a47e7-6213-eb11-8da9-e4434bdf6706.jpeg

递归调用栈

示例

- 计算阶乘的递归函数

def fact(x):    if x == 1:        return 1    else:        return x * fact(x-1)

详细分析调用fact(3)时调用栈是如何变化的。

9f8a47e7-6213-eb11-8da9-e4434bdf6706.jpeg

a28a47e7-6213-eb11-8da9-e4434bdf6706.jpeg

a48a47e7-6213-eb11-8da9-e4434bdf6706.jpeg

注:每个fact调用都有自己的变量。在一个函数调用中不能访问另一个的x变量。

栈在递归中国扮演者重要角色,在看一下寻找钥匙的第一种方法

a98a47e7-6213-eb11-8da9-e4434bdf6706.jpeg

使用这种方法时,创建一个带查找的盒子堆,因此始终知道哪些盒子需要查找。

但使用过递归方法时,没有盒子堆。

因为原来“盒子堆”存储在栈中!栈中包含未完成的函数调用,每个函数调用都包含还未检查完的盒子。

使用栈就无需自己跟踪盒子堆——栈已经替我们做了。

使用栈虽然方便,但是也要付出代价:存储详尽的信息可能占用大量的内存。每个函数调用都要占用一定的内存,如果栈很高,就意味着计算机存储了大量函数调用的信息。

这种情况有两种选择:

- 重新编写代码,转而使用循环

- 使用尾递归。(高级递归主题)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值