3.1 递归
递归通俗来讲就是”自己调用自己“。
”如果使用循环,程序的性能可能更高;如果使用递归,程序可能更容易理解。如何选择要看什么对你来说更重要。“
3.2 基线条件和递归条件
- 基线条件(base case):函数调用自己
- 递归条件(recursive case):函数不再调用自己
def countdown(i):
print(i)
if i <= 0: #基线条件
return
else: #递归条件
countdown(i-1)
3.3 栈
栈是一种先进后出的数据结构,有两种操作:压入和弹出。
3.3.1 调用栈
所有函数调用都进入调用栈
- 函数执行时,调用顺序是从外部函数到内部函数。
- 函数返回时,返回顺序是从内部函数到外部函数。
3.3.2 递归调用栈
递归函数使用调用栈来实现,例如一个计算阶乘的递归函数
def fact(x):
if x == 1:
return 1
else
return x * fact(x-1)
使用栈的代价是计算机存储了大量函数调用的信息,这种情况下有两种选择:
- 重新编写代码,转而使用循环。
- 使用尾递归。