python之递归函数

递归虽然用的不多但是还是有一些应用场景的,比较难懂,大概研究了一下.

def func(num):
    if num > 1:
        return num * func(num - 1)
    else:
        return num
    
print(func(5))
#打印结果120

  如何解读这段代码.

  1. 首先定义的这个递归函数,他传递一个值NUM
  2. 当num大于1的时候,他会return  num*func(num - 1) 这个时候我们知道num等于5 所以这个retrun的值具体应该是 5*func(4)  注意这时候程序并未执行,这段代码相当于待机,等待func(4)出结果.
  3. 由于我们func(4),这表示已经调用了函数,虽然他调用的是自身,但是不影响他运行.
  4. 运行的结果,num=4  4大于1.
  5. 于是我们又得到第二个待机的序列  4*func(3)
  6. 同上继续调用func(3)  得出第三个待机序列  3*func(2)
  7. 只要num大于1,程序就会继续迭代序列出来  我们得到了第四个序列  2*func(1)
  8. 此刻终于有不同的了,因为num=1 而1并不大于1,所以程序跑到了else.也就是说 func(1)有了具体值   那么第四个序列的值就出来了.func(2)就表示2*1 =2
  9. func(2)的值具象化了以后,func(3)也就可以计算了.第三个序列3*2=6
  10. 拿着func(3)的值6继续往func(4)跑  第二个带机序列  4*6=24
  11. func(4) = 24  那么  第一个待机序列  func(5)终于出了结果 5*24 =120
  12. 也就是可以理解是  递归是一个函数不停的迭代,并且按我们设定的方式去变化,每次迭代都会产生一个待执行的代码,直到迭代结束,再用最后一个具象化的结果往前面倒推,直到推至第一个待执行的代码,计算完毕后抛出值.

 

 

好到这里我们大概知道了递归是干什么用的,似乎也不是那么有用对吗.那么我们再看下面这个例子

#比如我有一个多层嵌套的字典

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)

 

递归大概先研究到这里 ,以后有用到,再研究再补充.

posted @ 2025-03-12 16:06  叶无齐  阅读(34)  评论(0)    收藏  举报

python学习之路

[python随笔]