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

posted @ 2021-01-30 17:39  Mr_huangze  阅读(92)  评论(0)    收藏  举报