python之递归函数
递归虽然用的不多但是还是有一些应用场景的,比较难懂,大概研究了一下.
def func(num): if num > 1: return num * func(num - 1) else: return num print(func(5)) #打印结果120
如何解读这段代码.
- 首先定义的这个递归函数,他传递一个值NUM
- 当num大于1的时候,他会return num*func(num - 1) 这个时候我们知道num等于5 所以这个retrun的值具体应该是 5*func(4) 注意这时候程序并未执行,这段代码相当于待机,等待func(4)出结果.
- 由于我们func(4),这表示已经调用了函数,虽然他调用的是自身,但是不影响他运行.
- 运行的结果,num=4 4大于1.
- 于是我们又得到第二个待机的序列 4*func(3)
- 同上继续调用func(3) 得出第三个待机序列 3*func(2)
- 只要num大于1,程序就会继续迭代序列出来 我们得到了第四个序列 2*func(1)
- 此刻终于有不同的了,因为num=1 而1并不大于1,所以程序跑到了else.也就是说 func(1)有了具体值 那么第四个序列的值就出来了.func(2)就表示2*1 =2
- func(2)的值具象化了以后,func(3)也就可以计算了.第三个序列3*2=6
- 拿着func(3)的值6继续往func(4)跑 第二个带机序列 4*6=24
- func(4) = 24 那么 第一个待机序列 func(5)终于出了结果 5*24 =120
- 也就是可以理解是 递归是一个函数不停的迭代,并且按我们设定的方式去变化,每次迭代都会产生一个待执行的代码,直到迭代结束,再用最后一个具象化的结果往前面倒推,直到推至第一个待执行的代码,计算完毕后抛出值.
好到这里我们大概知道了递归是干什么用的,似乎也不是那么有用对吗.那么我们再看下面这个例子
#比如我有一个多层嵌套的字典 dict1 = { "扬州": { "邗江区": { "邗江街道": { "得月苑": "邗江中路12号", "金域蓝湾": "邗江中路13号", "望月楼": "邗江中路14号", "天下一品": "邗江中路15号", }, "汤汪街道": { "通运商贸城": "汤汪路12号", "嘉年华": "汤汪路13号", "99广场": "汤汪路14号", "美食园": "汤汪路15号", }, "扬子江街道": { "万达广场": "扬子江路12号", "长剑广场": "扬子江路13号", "万达苑": "扬子江路14号", "金器街": "扬子江路15号", }, }, "江都区": { "江都街道": { "得月苑": "邗江中路12号", "金域蓝湾": "邗江中路13号", "望月楼": "邗江中路14号", "天下一品": "邗江中路15号", }, "马鹏街道": { "通运商贸城": "汤汪路12号", "嘉年华": "汤汪路13号", "99广场": "汤汪路14号", "美食园": "汤汪路15号", }, "新疆街道": { "万达广场": "扬子江路12号", "长剑广场": "扬子江路13号", "万达苑": "扬子江路14号", "金器街": "扬子江路15号", }, }, "高邮市": { "中心大道": { "得月苑": "邗江中路12号", "金域蓝湾": "邗江中路13号", "望月楼": "邗江中路14号", "天下一品": "邗江中路15号", }, "波斯顿大道": { "通运商贸城": "汤汪路12号", "嘉年华": "汤汪路13号", "99广场": "汤汪路14号", "美食园": "汤汪路15号", }, "凌波路": { "万达广场": "扬子江路12号", "长剑广场": "扬子江路13号", "万达苑": "扬子江路14号", "金器街": "扬子江路15号", }, }, }, "淮安": { "邗江区": { "邗江街道": { "得月苑": "邗江中路12号", "金域蓝湾": "邗江中路13号", "望月楼": "邗江中路14号", "天下一品": "邗江中路15号", }, "汤汪街道": { "通运商贸城": "汤汪路12号", "嘉年华": "汤汪路13号", "99广场": "汤汪路14号", "美食园": "汤汪路15号", }, "扬子江街道": { "万达广场": "扬子江路12号", "长剑广场": "扬子江路13号", "万达苑": "扬子江路14号", "金器街": "扬子江路15号", }, }, "江都区": { "江都街道": { "得月苑": "邗江中路12号", "金域蓝湾": "邗江中路13号", "望月楼": "邗江中路14号", "天下一品": "邗江中路15号", }, "马鹏街道": { "通运商贸城": "汤汪路12号", "嘉年华": "汤汪路13号", "99广场": "汤汪路14号", "美食园": "汤汪路15号", }, "新疆街道": { "万达广场": "扬子江路12号", "长剑广场": "扬子江路13号", "万达苑": "扬子江路14号", "金器街": "扬子江路15号", }, }, "高邮市": { "中心大道": { "得月苑": "邗江中路12号", "金域蓝湾": "邗江中路13号", "望月楼": "邗江中路14号", "天下一品": "邗江中路15号", }, "波斯顿大道": { "通运商贸城": "汤汪路12号", "嘉年华": "汤汪路13号", "99广场": "汤汪路14号", "美食园": "汤汪路15号", }, "凌波路": { "万达广场": "扬子江路12号", "长剑广场": "扬子江路13号", "万达苑": "扬子江路14号", "金器街": "扬子江路15号", }, }, }, "盐城": {}, "南京": {}, }
假设这种字典,我要由用户选择到最后一层后,打印出地址.用for嵌套我们当然可以做到,但是递归很简洁的就可以实现,看代码
def funccity(dic): #定义一个递归函数,传递进来一个字典 while 1: #先缔造一个无限循环 for city in dic.keys(): #循环取出字典的key并打印 print(city) choose = input('请输入查询对象>>>>>') #根据用户的输入 if choose == 'q': #结束程序 return elif choose in dic.keys(): #当用户的输入在key中的时候 if not type(dic[choose]) == dict: #如果是最后一层,也就是后面没有字典嵌套了.就打印出value,并且结束 print(dic[choose]) return return funccity(dic[choose]) # 递归到下一层,将下一层的字典传递给函数重新执行,这时候再执行的函数,就是在字典的第二层了. funccity(dict1)
递归大概先研究到这里 ,以后有用到,再研究再补充.