递归调用栈
示例
- 计算阶乘的递归函数
def fact(x): if x == 1: return 1 else: return x * fact(x-1)
详细分析调用fact(3)时调用栈是如何变化的。
注:每个fact调用都有自己的变量。在一个函数调用中不能访问另一个的x变量。
栈在递归中国扮演者重要角色,在看一下寻找钥匙的第一种方法
使用这种方法时,创建一个带查找的盒子堆,因此始终知道哪些盒子需要查找。
但使用过递归方法时,没有盒子堆。
因为原来“盒子堆”存储在栈中!栈中包含未完成的函数调用,每个函数调用都包含还未检查完的盒子。
使用栈就无需自己跟踪盒子堆——栈已经替我们做了。
使用栈虽然方便,但是也要付出代价:存储详尽的信息可能占用大量的内存。每个函数调用都要占用一定的内存,如果栈很高,就意味着计算机存储了大量函数调用的信息。
这种情况有两种选择:
- 重新编写代码,转而使用循环
- 使用尾递归。(高级递归主题)