寻找盒子中的钥匙
while方法
- 创建一个要查找的盒子堆
- 从盒子堆里取出一个盒子,在里面找
- 如果找到的是盒子,就将其加入盒子堆中,以后再查找
- 如果找到钥匙,则大功告成
- 返回第二步
1 | def look_for_key(box): |
递归方法
- 检查盒子中每一样东西
- 如果是盒子,就回到第一步
- 如果是钥匙,则大功告成
1 | def look_for_key(box): |
如果使用循环,程序的性能可能更高;如果使用递归,程序可能更容易理解
每一个递归函数都有两个部分:基线条件(函数不在调用自己)和递归条件(函数调用自己)
栈
计算机在内部使用被称为 调用栈 的栈。1
2
3
4
5
6
7
8
9def 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 "bye"
当运行函数greet(name)的时候需要调用另外两个函数。
函数的调用过程
当你调用greet(“chris”)的时候,计算机首先为函数调用分配一块内存,变量信息会存在内存中。首先会打印hello world,然后调用greet2(“chris”).同样的greet2(“chris”)函数也会被分配一个内存块。计算机会使用一个栈来表示这些内存块,其中第二个内存块在第一个内存块上面。当第二个内存块的函数执行完毕,调用返回时,第二个内存块会从栈内被弹出。此时继续执行第一个内存块的内容() 当调用另一个函数的时候,当前函数暂定并处于未完成状态 )。此时第一个内存块执行bye()函数,和之前类似,分配内存块并执行,执行完后被弹出栈。一直到栈中没有任何内存块可以执行为止。
这个栈存储了多个函数的变量,被称为调用栈。
递归函数栈
1 | def fact(x): |
使用栈虽然方便,但是也要符出代价:存储详尽的信息可能占用大量的内存。这种情况下两种选择:1.重新编码,使用循环 2.使用尾递归