python函数递归之模拟问路程序
递归
上代码
1 person_list = ['alex', 'wupeiqi', 'yuanhao', 'linhaifeng', 'ws'] 2 3 def ask_way(person_list): 4 print('-' * 60) 5 if len(person_list) == 0: 6 return '没人知道' 7 person = person_list.pop(0) 8 if person == 'linhaifeng': 9 return '%s说:我知道,老男孩就在沙河汇德商厦,下地铁就是' % person 10 11 print('hi美男%s,敢问路在何方' % person) 12 print('%s回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问%s...' % (person, person_list)) 13 # time.sleep(3) 14 res = ask_way(person_list) 15 print('%s问的结果是%r' % (person, res)) 16 return res 17 18 19 res = ask_way(person_list) 20 21 print('\n主函数最终结果(问路结果)是:\n', res)
output:
------------------------------------------------------------
hi美男alex,敢问路在何方
alex回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问['wupeiqi', 'yuanhao', 'linhaifeng', 'ws']...
------------------------------------------------------------
hi美男wupeiqi,敢问路在何方
wupeiqi回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问['yuanhao', 'linhaifeng', 'ws']...
------------------------------------------------------------
hi美男yuanhao,敢问路在何方
yuanhao回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问['linhaifeng', 'ws']...
------------------------------------------------------------
yuanhao问的结果是'linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是'
wupeiqi问的结果是'linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是'
alex问的结果是'linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是'
主函数最终结果(问路结果)是:
linhaifeng说:我知道,老男孩就在沙河汇德商厦,下地铁就是
总结:这里是一个模拟问路的程序,使用递归的方式.每一次递归,第十四行都在等待一个return的值res,而一旦得到res,本层递归(自己的理解,说法可能不准确,不喜勿喷)结束,向外层或者结束整个函数.从列表作为参数传入函数内部,每经历一次pop(),删除并返回列表第一个"人"名字,由这个"人"执行问路的操作,没有问到结果,继续向下一个请教,即代码执行到下一个"人",依次类推,直到代码有结束递归的条件,这里的是 person == 'linhaifeng' ,也就是说,直到问到了知道路的人,把问到的结果(res)依次返回给上一个人,代码中把结果返回给上一个"人",上一个"人"可以把代码继续走下去,直到第一个"人"拿到结果,最终完成问路的程序,把结果交给外层的res,模拟的问路也得到了结果,告知问路人.
递归特性:
1.必须有一个明确的结束条件
2.每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3.递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
递归扫盲http://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html
尾递归优化:http://legon09.blog.51cto.com/9161406/1842475