基线条件和递归条件
每个递归函数都有两部分:
- 递归条件:函数调用自己
- 基线条件:函数不再调用自己,避免无限循环
例:倒数函数
def countdown(i):
print (i)
if i<=0:
return
else:
countdown(i-1)
countdown(5)
>>>5
4
3
2
1
0
栈
调用栈
计算机在内部使用被称为调用栈的栈,下面是一个简单的函数
def greet2(name):
print("how are you,"+name+"?")
def bye():
print("ok bye!")
def greet(name):
print("hello,"+name+"!")
greet2(name)
print("getting ready to say bye")
bye()def greet2(name):
print("how are you,"+name+"?")
def bye():
print("ok bye!")
下面详细介绍调用函数时发生的情况:
假设调用greet("maggie")
,
- 计算机将首先为该函数调用分配一块内存
- 变量
name
被设置为"maggie“,存储在内存中 greet2("maggie")
调用,为该函数分配一块内存,将"maggie"存入内存,greet2入栈- 打印"how are you,maggie?",从调用函数返回,greet2出栈。
- 栈顶又是
greet
:调用另一个函数时,当前函数暂停并处于未完成状态。从greet2
之后继续执行 - 添加
bye
内存块,打印"ok bye!"并从这个函数返回 - 回到
greet
,由于没有别的任务了,就从greet
返回。
递归调用栈
计算阶乘的递归函数:
def fact(x):
if x==1:
return 1
else:
return x*fact(x-1)
下面分析调用fact(3)
时调用栈的变化。
尽管使用栈很方便,但是代价就是占用了大量的内存。在这种情况下,有两种处理办法:
- 重新编写代码,转而使用循环
- 使用尾递归
小结
- 递归是指调用自己的函数
- 递归有两个条件:基线条件和递归条件
- 栈有两种操作:压入和弹出
- 所有函数调用都进入调用栈
- 调用栈很长,将占用大量内存