递归调用栈
def fact(x):
if x == 1: #基线条件
return 1
else: #递归条件
return x * fact(x-1)
def fact(x):
if x == 1: #基线条件:要让脚本知道何时停止运行
return 1
else: #递归条件:让脚本知道何时调用自己
return x * fact(x-1)
过程详解
调用fact(3) | ||||||||||||||
运行代码 | 调用栈 | 备注 | ||||||||||||
Fact(3) |
| 第一次调用fact x为3 | ||||||||||||
If x == 1: |
| |||||||||||||
Else: |
| |||||||||||||
Return x*fact(x-1) |
| 第二次调用fact(上面) x为2 在第二次函数调用中,不能访问第一次调用的x变量,反之亦然。 | ||||||||||||
If x == 1: |
| |||||||||||||
Else: |
| |||||||||||||
Return x*fact(x-1) |
| 第三次调用fact x为1 在第三次函数调用中,不能访问第二次调用的x变量,反之亦然。 | ||||||||||||
If x == 1: |
| X == 1 为 True | ||||||||||||
Return 1 |
| 返回1 | ||||||||||||
Return 2*1 |
| 返回2 | ||||||||||||
Return 3*2 |
| 返回6 | ||||||||||||
完成fact(3) |
递归和循环对比
从盒子里找🔑,盒子里面又有盒子,🔑在某个盒子里。(使用伪代码)
循环算法:
def look_for_key(main_box):
pile = main_box.make_a_pile_to_look_through()
empty = None
while pile is not empty:
box = pile.grab_a_box()
for item in box:
if item.is_a_box():
pile.append(item)
elif item.is_a_key():
print("found the key!")
递归算法:
def look_for_the_key(box):
for item in box:
if item.is_a_box():
look_for_the_key()
elif item.is_a_key():
print("found the key!")
1.本题递归算法让解决方案更清晰,没有性能上的优势
2.有些情况下,使用循环性能更好
3.递归使用栈虽然很方便,但是可能占用大量内存,有两种解决办法
1.转而使用循环
2.使用尾递归(一个高级递归主题)