zoukankan      html  css  js  c++  java
  • [ Python ] 递归函数

    一、 什么是递归函数

        如果一个函数在内部调用自身本身,这个函数就是递归函数。
        在递归函数中,是一个有去有回的过程。

    二、递归函数的说明

    def fact(n):
            if n == 1:
                    return 1
            return n * fact(n - 1)
    
    print(fact(5))
    
    # fact(5)
    # ===> 5 * fact(4)
    # ===> 5 * (4 * fact(3))
    # ===> 5 * (4 * (3 * fact(2)))
    # ===> 5 * (4 * (3 * (2 * fact(1))))
    # ===> 5 * (4 * (3 * (2 * 1)))
    # ===> 5 * (4 * (3 * 2))
    # ===> 5 * (4 * 6)
    # ===> 5 * 24
    # ===> 120
    

        通过上面的实例,可以总结出:
            递归函数就是在函数内部调用自身本身,直到自身返回的是一个具体的值而不是函数,然后从内向外逐一返回函数的值,因此递归是一个有去有回两个过程组成的;

    三、一个递归函数的实例

    menu = {
            '陕西省': {
                    '西安':{
                            '未央区':{},
                            '莲湖区':{},
                            '高新区':{},
                    },
                    '咸阳':{
                            '秦都区':{},
                            '渭城区':{}
                    }
            },
            '四川省': {
                    '成都':{
                            '锦江区':{},
                            '青羊区':{},
                            '金牛区':{},
                    },
                    '绵阳':{
                            '涪城区': {},
                            '游仙区': {},
                    }
            }
    }
    
    def threeTL(dic):
            while True:
                    for key in dic: print(key)
                    choice = input('>>>').strip()
                    if choice == 'b' or choice == 'q': return choice
                    elif choice in dic and dic[choice]:
                            res = threeTL(dic[choice])
                            if res == 'q': return 'q'
                    elif not choice or choice not in dic:
                            continue
    
    threeTL(menu)
    menu_three.py

    该实例是选择省打印城市,输入城市打印区, 当用户输入 b 返回上一层,当用户输入 q 退出整个程序,这里最难理解的就是 b 和 q 的用法;

    分析如下:

    (1)正常递归深入过程:

    # def threeTL(dic):
    #     while True:
    #         for key in dic: print(key) # 陕西省、四川省
    #         choice = input('>>>').strip()   # 用户输入:陕西省
    #         if choice == 'b' or choice == 'q': return choice
    #         elif choice in dic and dic[choice]:
    #             res = threeTL(dic[choice])  # 递归返回 threeTL(dic['陕西省'])
    #             if res == 'q': return 'q'
    #         elif not choice or choice not in dic:
    #             continue
    #
    # def threeTL(dic): # dic = dic['陕西省']
    #     while True:
    #         for key in dic: print(key) # 西安、咸阳
    #         choice = input('>>>').strip()   # 用户输入:西安
    #         if choice == 'b' or choice == 'q': return choice
    #         elif choice in dic and dic[choice]:
    #             res = threeTL(dic[choice])  # 递归返回 threeTL(dic['陕西省']['西安'])
    #             if res == 'q': return 'q'
    #         elif not choice or choice not in dic:
    #             continue
    #
    # def threeTL(dic): # dic = dic['陕西省']['西安']
    #     while True:
    #         for key in dic: print(key) # 未央莲湖高新
    #         choice = input('>>>').strip()   # # 用户输入:未央区
    #         if choice == 'b' or choice == 'q': return choice
    #         elif choice in dic and dic[choice]:
    #             res = threeTL(dic[choice])  
    #             if res == 'q': return 'q'
    #         elif not choice or choice not in dic: # 因为未央区没有值,进入下一次循环
    正常递归深入过程
    threeTL(menu)
    -->threeTL(menu['陕西省'])
    -->threeTL(menu['陕西省'])-->threeTL(menu['陕西省']['西安'])
    -->threeTL(menu['陕西省'])-->threeTL(menu['陕西省']['西安'])-->threeTL(menu['陕西省']['西安']['未央区'])
    

    (2)当用户输入 ' b ':

    def threeTL(dic): # dic = dic['陕西省']['西安']
            while True:
                    for key in dic: print(key) # 未央莲湖高新
                    choice = input('>>>').strip()   # # 用户输入:b
                    if choice == 'b' or choice == 'q': return choice # 返回'b',程序退出
                    elif choice in dic and dic[choice]:
                            res = threeTL(dic[choice])  
                            if res == 'q': return 'q'
                    elif not choice or choice not in dic:
                            continue
    
    def threeTL(dic): # dic = dic['陕西省']
            while True:
                    for key in dic: print(key) # 第二次while循环打印 <西安、咸阳>(第一次while循环是在递归函数深入的时候执行)
                    choice = input('>>>').strip()   # 第二次while循环到此,用户输入 b
                    if choice == 'b' or choice == 'q': return choice # 返回'b',程序退出
                    elif choice in dic and dic[choice]:
                            res = threeTL(dic[choice])  # res = 'b', 本次if循环没有匹配到res退出,进行下一次while循环
                            if res == 'q': return 'q'
                    elif not choice or choice not in dic:
                            continue
    
    def threeTL(dic):
            while True:
                    for key in dic: print(key) # 第二次while循环打印 <陕西省、四川省>(第一次while循环是在递归函数深入的时候执行)
                    choice = input('>>>').strip()   # 第二次while循环到此,用户输入 b
                    if choice == 'b' or choice == 'q': return choice # 返回'b',整个程序退出,递归结束
                    elif choice in dic and dic[choice]:
                            res = threeTL(dic[choice])  # 递归返回 threeTL(dic['陕西省'])
                            if res == 'q': return 'q'
                    elif not choice or choice not in dic:
                            continue
    输入'b',代码执行过程

    (3)当用户输入 'q'

    def threeTL(dic): # dic = dic['陕西省']['西安']
            while True:
                    for key in dic: print(key) # 未央莲湖高新
                    choice = input('>>>').strip()   # # 用户输入:q
                    if choice == 'b' or choice == 'q': return choice # 返回'q',程序退出
                    elif choice in dic and dic[choice]:
                            res = threeTL(dic[choice])  
                            if res == 'q': return 'q'
                    elif not choice or choice not in dic:
                            continue
    
    def threeTL(dic): # dic = dic['陕西省']
            while True:
                    for key in dic: print(key) # <西安、咸阳>
                    choice = input('>>>').strip()    
                    if choice == 'b' or choice == 'q': return choice 
                    elif choice in dic and dic[choice]:
                            res = threeTL(dic[choice])  # res = 'q'
                            if res == 'q': return 'q'    # 匹配到 res='q' 返回 'q' 程序退出
                    elif not choice or choice not in dic:
                            continue
    
    def threeTL(dic): # dic = dic['陕西省']['西安']
            while True:
                    for key in dic: print(key) # 未央莲湖高新
                    choice = input('>>>').strip()   # # 用户输入:q
                    if choice == 'b' or choice == 'q': return choice # 返回'q',程序退出
                    elif choice in dic and dic[choice]:
                            res = threeTL(dic[choice])  
                            if res == 'q': return 'q'
                    elif not choice or choice not in dic:
                            continue
    输入'q',代码执行过程
  • 相关阅读:
    网站SEO优化问答精选
    用eclipse怎样将本地的项目打成jar包上传到maven仓库
    查询linux机器的公网ip
    Srping mvc mabatis 报错 org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):
    使用SecureCRT的SFTP在WINDOWS与LINUX之间传输文件(转载)
    苹果手机如何减少后台流量
    《图解CSS3——第4章 CSS3背景-2》
    《图解CSS3——第4章 CSS3背景-1》
    《图解CSS3——第3章 CSS3边框-4》
    《图解CSS3——第3章 CSS3边框-3》
  • 原文地址:https://www.cnblogs.com/hukey/p/9336233.html
Copyright © 2011-2022 走看看