(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