• day16 python学习 递归


    
    

    初识递归

    
    

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

    
    

    现在我们已经大概知道刚刚讲的story函数做了什么,就是在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归

    
    

    刚刚我们就已经写了一个最简单的递归函数。

    
    

    递归的最大深度——997

    
    

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

    
    

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


    #初识递归

    # def story():
    # print('gushide neirongshi ')
    # story()
    # story()
    #
    #多大了alex,我不告诉你,alex比egon大两岁 44+2
    #egon多大了,我不告诉你,egon比wusir大两岁 42+2
    #wusir多大了,我不告诉你,wusir比金鑫大两岁 40+2
    #金鑫40了
     def age(n):
    #     if n==4:
    #         return 40
    #     return age(n+1)+2
    # print(age(1))
    # #以下是拆解的分析过程
    # def age(4):
    #     if 4==4:
    #         return 40
    #     # return age(3+1)+2  n=4 这一步不执行
    # def age(3):
    #     if 3==4: #3!=4这一步不执行
    #         return 40
    #     return age(3+1)+2  #根据age4的到age3的内容  age(3)=40+2=42
    # def age(2):
    #     if 2==4: #2!=4这一步不执行
    #         return 40
    #     return age(2+1)+2#根据age3的到age2的内容  age(2)=42+2=44
    # def age(1):
    #     if 1==4: #1!=4这一步不执行
    #         return 40
    #     return age(1+1)+2#根据age2的到age1的内容  age(1)=44+2
    #最后也是开始调用了age(1)想得到到他得结果,print(age(1))
    #
    
    
    二分找法
    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(l.index(66))#最传统的放法
    #初级递归
    #  但是1不能显示他的索引位,
    #
    # def func(l,n):
    #     mid=len(l)//2
    #     if l:
    #         if l[mid]>n:
    #             new_l=l[:mid]
    #             func(new_l,n)
    #         elif l[mid]<n:
    #             new_l=l[mid+1:]
    #             func(new_l,n)
    #         elif l[mid]==n:
    #             print(n,mid)
    #     else:
    #         print('数字不在内部')
    # func(l,68)
    二分找法
    
    
    def func(l,n,start=0,end=None):#第一个问题,传参,这样传参数,就不会对函数进行切割,
            if end==None:#而是去下标范围内的数值,l 不变
                end=len(l)-1
            if start < end:  #当函数不存在时会出现func(l,n,mid+1,end)中的mid+1>end
                mid=(start+end)//2# 因为取到所有的值了,此时end=0
                if l[mid]>n:
                    func(l,n,start,mid)#这个是取的区间,而为改变列表
                elif l[mid]<n:
                    func(l,n,mid+1,end)
                elif l[mid]==n:
                    print(n,mid)
            else:
                print('数字不在内部')
    func(l,67,start=0,end=None)
    二分查找终极版
    
    
    

    三级菜单
    menu = {
        '北京': {
            '海淀': {
                '五道口': {
                    'soho': {},
                    '网易': {},
                    'google': {}
                },
                '中关村': {
                    '爱奇艺': {},
                    '汽车之家': {},
                    'youku': {},
                },
                '上地': {
                    '百度': {},
                },
            },
            '昌平': {
                '沙河': {
                    '老男孩': {},
                    '北航': {},
                },
                '天通苑': {},
                '回龙观': {},
            },
            '朝阳': {},
            '东城': {},
        },
        '上海': {
            '闵行': {
                "人民广场": {
                    '炸鸡店': {}
                }
            },
            '闸北': {
                '火车战': {
                    '携程': {}
                }
            },
            '浦东': {},
        },
        '山东': {},
    }
    def o_menu(menu):
        while True:
            for key in menu:
                print(key)
            select=input('选择')
            if select=="q":
                return 'q'
            if select=='b':
                return 'b'
            if select in menu and menu[select]:  这句话的意思是满足select在menu中,而且 下一级为字典,不是空的情况
                borq= o_menu(menu[select])#这儿跟send有点像,执行到这儿return o_menu(menu[select])
                if borq=='q':  #但是当能够执行下去的话,在下一次循环中我输入了b 就会把b return给
                    return 'q'#上一次调用的函数就是 o_menu(menu[select])  然后就borq =="b"了什么也不做
    o_menu(menu)            #当等于'q"时,就会返回给上次的函数,直到跳出
    三级菜单
    
    
  • 相关阅读:
    数据结构复习代码——线索二叉树的实现
    数据结构复习代码——非递归实现二叉树的遍历方法
    数据结构复习代码——递归实现二叉树的创建、前中后序遍历、层次遍历、求节点个数、求树高
    mount参数介绍
    mysqlslap基准测试
    计算shell脚本执行时间
    Linux中使用pigz工具更快的压缩和解压文件
    mount参数介绍
    linux 硬链接与软链接
    fsck
  • 原文地址:https://www.cnblogs.com/wangkun122/p/7805623.html
Copyright © 2020-2023  润新知