• 递归函数


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

    下面就是一个简单的递归函数代码。

    1 def foo(n):
    2     print(n)
    3     n += 1
    4     foo(n)
    5 foo(1)

    二:递归的最大深度——997,运行上面的代码就会得出。

    当然最大深度是可以改变的。

    import sys
    print(sys.setrecursionlimit(100000)
    可以调用sys来改变深度,后面的数字就是改变后的最大深度。

    三:递函数的应用

    age(4) = age(3) + 2 
    age(3) = age(2) + 2
    age(2) = age(1) + 2
    age(1) = 40
    像这种重复的函数,就可以用递归函数来简写
    def age(n):
        if n==1:
            return 40 
        else:
            ret=n-1
            return age(ret)+2
    age(4)
    View Code
    
    

    四:递归函数与三级菜单(一个菜单):下面是一个很有名的三级菜单,

    menu = {
        '北京': {
            '海淀': {
                '五道口': {
                    'soho': {},
                    '网易': {},
                    'google': {}
                },
                '中关村': {
                    '爱奇艺': {},
                    '汽车之家': {},
                    'youku': {},
                },
                '上地': {
                    '百度': {},
                },
            },
            '昌平': {
                '沙河': {
                    '老男孩': {},
                    '北航': {},
                },
                '天通苑': {},
                '回龙观': {},
            },
            '朝阳': {},
            '东城': {},
        },
        '上海': {
            '闵行': {
                "人民广场": {
                    '炸鸡店': {}
                }
            },
            '闸北': {
                '火车战': {
                    '携程': {}
                }
            },
            '浦东': {},
        },
        '山东': {},
    }
    View Code

    答案在这里:

    def threeLM(dic):
        while True:
            for k in dic:print(k)
            key = input('input>>').strip()
            if key == 'b' or key == 'q':return key
            elif key in dic.keys() and dic[key]:
                ret = threeLM(dic[key])
                if ret == 'q': return 'q'
            elif (not dic.get(key)) or (not dic[key]) :
                continue
    View Code

    五:二分法

    定义:就是把一分为二,把一个整体一次切成2半,后面再切半,以此来提高算法的效率,是递归的一种用法。

    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]
    
    def func(l,aim):
        mid = (len(l)-1)//2
        if l:
            if aim > l[mid]:
                func(l[mid+1:],aim)
            elif aim < l[mid]:
                func(l[:mid],aim)
            elif aim == l[mid]:
                print("bingo",mid)
        else:
            print('找不到')
    func(l,66)
    func(l,6)
    
    复制代码
    View Code

    2,下面是找列表里是否有要找的数据,和要位置

    def func(l, aim,start = 0,end = len(l)-1 ):
        mid = (start+end)//2
        if not l[start:end+1]:
            return
        elif aim > l[mid]:
            return func(l,aim,mid+1,end)
        elif aim < l[mid]:
            return func(l,aim,start,mid-1)
        elif aim == l[mid]:
            print("bingo")
            return mid
    
    index = func(l,68)
    print(index)
    View Code

    总结:递归和我们while循环和for 循环有点像,但是他是未来的一个方向,按照老师说的是,大神用递归,小孩用循环。

     



      

  • 相关阅读:
    动态规划----背包问题
    动态规划----最长公共子序列
    贪心算法---codeforce680D Bear and Tower of Cubes
    贪心算法----Fence Repair(POJ 3253)
    线段树拓展----HDU 6315 Naive Operations
    Saruman`s Army(POJ 3069)
    字典序最小问题 Best Cow Line (POJ 3617)
    RMQ
    牛客2018年第二次acm暑期培训----H-Diff-prime Pairs
    牛客2018年第二次多校培训----A-run
  • 原文地址:https://www.cnblogs.com/52forjie/p/7265361.html
Copyright © 2020-2023  润新知