递归使用场景:箱子1上锁了,钥匙在箱子2中,但是箱子2中也有一堆小箱子,钥匙在其中的小箱子中。
def look_for_key(box):
for item in box:
if item.is_a_box():
look_for_key(item) Recursion!
elif item.is_a_key():
print “found the key!”
这段代码的意思是,首先把箱子2输入进函数。for item in box,这条命令是遍历箱子2中所有的小箱子。假如小箱子里还有更小的箱子,那么继续遍历,直到找到钥匙。
另外,使用递归,需要注意的是:要如下面代码一样,有两条分支,一条是递归分支,一条是跳出递归分支,不适用的话会造成死循环
def countdown(i):
print i
if i <= 0: Base case
return
else: Recursive case
countdown(i-1)
call stack
有两种状态,如下图所示:
1.在list开头放入一个新元素
2.在list开头弹出一个新元素,并读取它
举一个例子,如下图所示,你能从这幅图中得出什么信息
The call stack with recursion
参考如下阶乘代码
def fact(x):
if x == 1:
return 1
else:
return x * fact(x-1)
下图为阶乘代码在call stack中的图解
从图中可以看到,阶乘的过程是首先把函数调用堆起来,如下图所示
其实这个时候,一次计算也没有发生,然后,接下来从最上方开始,依次计算 ,分别调用。
递归的特点:耗费内存空间,但是容易阅读,递归太多次,内存不够,会出现 stackoverflow error错误。
循环的特点:不耗费空间,但是不容易阅读
本章小结
All function calls go onto the call stack的意思就是说,每一个函数调用,都会叠加在call stack上面,上面有个阶乘的图,就是这种情况