(1) 创建一个要查找的盒子堆。
(2) 从盒子堆取出一个盒子,在里面找。
(3) 如果找到的是盒子,就将其加入盒子堆中,以便以后再查找。
(4) 如果找到钥匙,则大功告成!
(5) 回到第二步。
def look_for_key(main_box):
pile=main_box.make_a_pile_to_look_through()
while pile is not empty:
box=pile.grap_a_box
for item in box:
if item.is_a_box():
pile.append(item)
elif item.is_a_key():
print(‘found a key‘)
(1) 检查盒子中的每样东西。
(2) 如果是盒子,就回到第一步。
(3) 如果是钥匙,就大功告成!
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 a key‘)
如果使用循环,程序的性能可能更高;如果使用递归,程序可能更容易理解。如何选择要看什么对你来说更重要。
编写递归函数时,必须告诉它何时停止递归。否则会导致无限循环。
基线条件(base case)和递归条件(recursive case)
def countdown(i):
print(i)
if i<=0: #基线条件
return
else: #递归条件
countdown(i-1)
print(countdown(4))
栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。
LIFO,即后进先出(Last in, first out)
计算机在内部使用被称为调用栈的栈。
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()
print(greet(‘lilip‘))
调用过程
调用另一个函数时,当前函数暂停并处于未完成状态。该函数的所有变量的值都还在内存中
这个栈用于存储多个函数的变量,被称为调用栈。
递归函数也使用调用栈!
阶乘递归函数
def fact(x):
if x==1:
return 1
else:
return x*fact(x-1)
print(fact(3))
调用过程
|
代码 |
调用栈 |
备注 |
||||||||||||||||||
|
fact(3) |
|
第一次调用fact x=3 |
||||||||||||||||||
|
if x==1: |
|
|
||||||||||||||||||
|
else: |
|
|
||||||||||||||||||
|
return x*fact(x-1) |
|
递归调用 |
||||||||||||||||||
|
if x==1: |
|
现在位于对fact的第二次调用中 x=2 最上面的函数调用是当前所处的调用 |
||||||||||||||||||
|
else: |
|
两个函数调用都有变量x,但这些x变量的值不同 |
||||||||||||||||||
|
return x*fact(x-1) |
|
在栈顶层调用中,不能访问下面其他内存块调用的x变量,反之亦然 |
||||||||||||||||||
|
if x==1: |
|
|
||||||||||||||||||
|
return 1 |
|
从栈中弹出第一个方块,意味着将从这个调用返回,返回1 |
||||||||||||||||||
|
return x*fact(x-1) |
|
x为2 fact(x-1)返回1 最终返回2 |
||||||||||||||||||
|
return x*fact(x-1) |
|
x为3 fact(x-1)返回2 最终返回6 |
||||||||||||||||||
注意:
原文:https://www.cnblogs.com/lilip/p/9515186.html