• Python--递归


    面向函数编程

    def func():
        print('从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呀?')
     func()

    解耦:尽量把不相关的功能拆开,用的时候再调用函数,增强代码重用性,减少代码变更的相互影响
    要完成一个完整的功能,但这个功能的规模要尽量小,并且和这个功能无关的其他代码应该和这个函数
    分离
    recursion 递归

    什么是递归:

    一个函数在内部调用了自己本身

    def func():
        print('从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呀?')
     func()
     print('123')

    这里面的123永远不会打印,永远都在执行下一个func()
    import sys 和python解释器相关的模块
    递归层数在python中最大997。可以改限制。

    import sys
    
    sys.setrecursionlimit(1000000)  # 修改最大范围 ---但是 python 自己会根据计算机性能停止
    
    count=0
    def func():
        global count
        count+=1
        print(count)
        func()
    func()

    递归实例:
    写递归函数,必须要有一个结束条件
    alex比egon大两岁      alex=egon+2
    egon比wusir大两岁     egon=wusir+2
    wusir比金鑫大两岁     wusir=金鑫+2
    金鑫40了              金鑫40

    推测的过程是递,后面计算是归

    def age(n):
        if n ==4:
            return 40
        return age(n+1)+2
    f = age(1)
    print(f)

    根据线索向下是递,拿到一个结果再向上是归

    递归方法求阶乘:

    def jie(n):
         return jie(n-1)*n
    
    print(jie(7))

    二分查找

    l=[1,5,6,7,8,9,25,26,78,123,456,789,1233,7899,8521,9635,10255]
    def search(num,l,start=None,end=None):
        start=start if start else 0
        end=end if end else len(l)-1
        mid = (end-start)//2+start
     if start>end:
        return None
        if l[mid]>num:
            return search(num,l,0,mid-1)
        if l[mid]<num:
            return search(num,l,mid+1,end)
        if l[mid]==num:
            return mid,l[mid]
    print(search(78,l))

    无序的先用.sort()排序

    斐波那契数列递归

    li=[1,1]
    def fib(n):
        if n>len(li):
            li.append(li[-2]+li[-1])
            fib(n)
        return li
    n = input('请输入要计算的数字个数:')
    n = int(n)
    ret = fib(n)
    print(ret)

    面试真题递归

    data={'time':'2016-08-05T13:13:05',
          'some_id':'ID1234',
    'grp1':{'fld1':1,'fld2':2},
    'xxx2':{'fld3':0,'fld5':0.4},
          'fld6':11,
          'fld7':7,
          'fld46':8}
    def select(data,fields):
        li=fields.split('|')
        for item in data:
                if item in li:
                    print(item,data[item])
                elif type(data[item])==dict:
                    ret = select(data[item],fields)
    n = input('按照格式输入:')
    select(data,n)

    三级菜单递归

    menu = {
        '北京': {
            '海淀': {
                '五道口': {
                    'soho': {},
                    '网易': {},
                    'google': {}
                },
                '中关村': {
                    '爱奇艺': {},
                    '汽车之家': {},
                    'youku': {},
                },
                '上地': {
                    '百度': {},
                },
            },
            '昌平': {
                '沙河': {
                    '老男孩': {},
                    '北航': {},
                },
                '天通苑': {},
                '回龙观': {},
            },
            '朝阳': {},
            '东城': {},
        },
        '上海': {
            '闵行': {
                "人民广场": {
                    '炸鸡店': {}
                }
            },
            '闸北': {
                '火车战': {
                    '携程': {}
                }
            },
            '浦东': {},
        },
        '山东': {},
    }
    #相同的数据类型 嵌套在一起
     def Three_Level_Menu(menu):
        while True:
            for k in menu:print(k)
            key = input('>>>')
            if key == 'q':return 'q'
            elif key == 'b':break
            elif key in menu:
                ret = Three_Level_Menu(menu[key])
            if ret == 'q': return 'q'
    Three_Level_Menu(menu)
    三级菜单
  • 相关阅读:
    使用EF进行简单的增删改查
    观察者模式(委托事件的小应用)
    lambda表达式和表达式树
    socket知识总结
    xml读写Demo
    winfrom DataGridView Demo
    6月26号.NET面试题(程序题部分)只要做懂这3道题肯定能脱离菜鸟称号!
    多线程与异步编程知识简单总结
    15年6月14号面试中没有回答出来的问题
    2020.5.15记一次阿里电话面试经历
  • 原文地址:https://www.cnblogs.com/gaoshengyue/p/7485020.html
Copyright © 2020-2023  润新知