• 递归函数:


    初识递归:

    递归的定义——在一个函数里再调用这个函数本身

    在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归

    递归的最大深度——997

    正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去。但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,于是python为了杜绝此类现象,强制的将递归层数控制在了997(只要997!你买不了吃亏,买不了上当...).

    拿什么来证明这个“997理论”呢?这里我们可以做一个实验:

    def foo(n):
        print(n)
        n += 1
        foo(n)
    foo(1)

    看到这里,你可能会觉得递归也并不是多么好的东西,不如while True好用呢!然而,江湖上流传这这样一句话叫做:人理解循环,神理解递归。所以你可别小看了递归函数,很多人被拦在大神的门槛外这么多年,就是因为没能领悟递归的真谛。而且之后我们学习的很多算法都会和递归有关系。

    递归:
    在一个函数里面调用自己
    默认的递归最大限度 997
    不要修改默认的递归最大限度
    往往 递归 都是 和循环挂在一起的
    人理解循环 神理解递归

    使用递归的特点:

    需要多次函数调用,并且每次调用都拥有相同的特点,各个之间有依赖性,适合用递归。
    递归函数最常用的场景,它有一个参数,根据你的一系列计算,可以将这个参数进行一些简化,且你后续的计算过程跟你之前的计算过程完全相似,这种情况就适合用递归函数。
    一个递归函数,如果没有条件的限制的话,它无法结束。

    例一:

    Alex的年龄:

    #多大了alex,我不告诉你,alex比egon大两岁    44+2
    #egon多大了,我不告诉你,egon比wusir大两岁   42+2
    #wusir多大了,我不告诉你,wusir比金鑫大两岁  40+2
    #金鑫40了

    翻译成程序语言:

    # age(1) n = 1 age(2)+2
    # age(2) n = 2 age(3)+2
    # age(3) n = 3 age(4)+2
    # age(4) n = 4 40

    def age(n):
        if n == 4:     #递归结束的条件
            return 40
        else:
            return age(n+1) + 2   #返回其本身的函数调用
    
    print(age(1))
    
    输出:
    46

    运行过程:

    # def age(1):
    #     if n == 4:
    #         return 40
    #     return age(1+1) + 2
    # def age(2):
    #     if n == 4:
    #         return 40
    #     return age(2+1) + 2
    # def age(3):
    #     if n == 4:
    #         return 40
    #     return age(3+1) + 2
    # def age(4):
    #     if n == 4:
    #         return 40
    #     return age(n+1) + 2

    例二:
    阶乘的计算:

    阶乘的定义:什么叫阶乘? 7  #7*6*5*4*3*2*1

    def f(n):
        if n == 1:  #递归结束的条件
            return 1
        else:
            return n*f(n-1)   #返回其本身的函数调用
    
    print(f(3))
    
    输出:
    6

    运行过程:

    def f(3):
        if 3 == 1:
            return 1
        else:
            return 3*f(2)
    
    def f(2):
        if 2 == 1:
            return 1
        else:
            return 2 * f(1)
    
    def f(1):
        if 1 == 1:
            return 1
        else:
            return n*f(n-1)

    例三:
    斐波那契数列
    1,1,2,3,5,8,13....

    求斐波那契数列中第10位是多少
    # n = 10
    # f(10) = f(8)+f(9)

    def fib(n):
        if n == 1 or n == 2:   #递归结束的条件
            return 1
        else:
            return fib(n-1)+fib(n-2) #返回其本身的函数调用
    
    print(fib(10))
    
    输出:
    55

    运算过程:

    fib(3):
    def fib(3):
        if 3 == 1 or 3 == 2:
            return 1
        return fib(2)+fib(1)
    
    def fib(2):
        if 2 == 1 or 2 == 2:
            return 1
        return fib(n-1)+fib(n-2)
    
    def fib(1):
        if 1 == 1 or 1 == 2:
            return 1
        return fib(n-1)+fib(n-2)

     例四:

    运用二分法在列表中查找一个值:

    #参数传递
    #返回值的问题
    #找不到值的人体
    #参数太多的问题

    def find_2(l,aim,start=0,end=None):  #[2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
        if end == None:
         end = len(l) - 1 if start <= end: mid = (end-start) // 2 + start if l[mid] > aim: ret = find_2(l,aim,start,mid-1) #返回这个函数调用 return ret elif l[mid] < aim: ret = find_2(l,aim,mid+1,end) #返回这个函数调用 return ret else: return aim,mid else: print('找不到这个值')

    运行输出:

    l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
    print(find_2(l,17))
    
    输出:
    找不到这个值
    None

    运行输出二:

    l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
    print(find_2(l,30))
    
    输出:
    (
    30, 9)

     例五:

    地区的三级调用:

    menu = {
        '北京': {
            '海淀': {
                '五道口': {
                    'soho': {},
                    '网易': {},
                    'google': {}
                },
                '中关村': {
                    '爱奇艺': {},
                    '汽车之家': {},
                    'youku': {},
                },
                '上地': {
                    '百度': {},
                },
            },
            '昌平': {
                '沙河': {
                    '老男孩': {},
                    '北航': {},
                },
                '天通苑': {},
                '回龙观': {},
            },
            '朝阳': {},
            '东城': {},
        },
        '上海': {
            '闵行': {
                "人民广场": {
                    '炸鸡店': {}
                }
            },
            '闸北': {
                '火车战': {
                    '携程': {}
                }
            },
            '浦东': {},
        },
        '山东': {},
    }
    
    def menu_3(menu):
        while True:             #当输入对的,就进下一层,输入不对,再输一次
            for key in menu:
                print(key)      #北京上海山东
            choice = input('选择 : ')   #北京
            if choice == 'q' or choice == 'b':
                return choice
            elif choice in menu and menu[choice]:        #北京 in menu
                borq =  menu_3(menu[choice])
                if borq == 'q':
                    return 'q'
    
    menu_3(menu)
  • 相关阅读:
    EEPROM与FLASH
    Sublime Markdown预览插件安装流程
    挖矿算法比较(转)
    CPU based record
    MVC学习之数据库开发模式:三种开发模式总结:
    MVC学习之数据库开发模式:模型优先实例介绍
    MVC学习之数据库开发模式:代码优先实例介绍
    MVC学习之数据库开发模式:数据库优先实例介绍
    DataSet之将连个DataSet集合合并成一个DataSet集合
    索引和长度必须引用该字符串内的位置。参数名: length
  • 原文地址:https://www.cnblogs.com/biluo/p/7805758.html
Copyright © 2020-2023  润新知