3.1 递归介绍
盒子中找钥匙
解决方案一:while 循环
def look_for_key(main_box):
pile = main_box.make_a_pile_to_look_through()
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_key(box):
for item in box:
if item.is_a_box():
look_for_key(item)
elif item.is_a_key():
print "found the key!"
3.2 基线条件和递归条件
编写递归函数时,必须告诉它何时停止递归。正因为如此,每个递归函数都有两部分:基线条件(base case)和递归条件(recursive case)。递归条件指的是函数调用自己,而基线条件则指的是函数不再调用自己,从而避免形成无限循环。
3.3 栈
栈是一种简单的数据结构。有两种操作:压入(插入)和弹出(删除并读取)。
调用栈
栈用于存储多个函数的变量时,被称为调用栈(call stack)。
每当你调用函数时,计算机会将函数调用涉及的所有变量的值存储到内存中。计算机使用一个栈来表示这些内存块,其中第二个内存块位于第一个内存块上面。当调用另一个函数时,当前函数暂停并处于未完成状态。
递归调用栈
下面是计算阶乘的递归函数。
def fact(x):
if x == 1:
return 1
else:
return x * fact(x-1)
- 栈顶的方框指出了当前执行到了什么地方。
- 每个fact调用都有自己的x变量。在一个函数调用中不能访问另一个 x x x的变量。
使用栈虽然很方便,但是也要付出代价:存储详尽的信息可能占用大量的内存。每个函数调用都要占用一定的内存,如果栈很高,就意味着计算机存储了大量函数调用的信息。解决方法:1.重新编写代码,转而使用循环。2.使用尾递归