• Python的函数递归


    一、函数的递归

      什么是函数的递归:函数的递归就是函数的递归调用:是函数嵌套调用的一种形式。

      具体是指:在调用一个函数的过程中又直接或者间接的调用到本身。

    # 1、直接调用本身(简单理解为死循环 )
    def f1():
        print('直接调用本身实例:')
        f1()
    
    f1()
    # RecursionError: maximum recursion depth exceeded while calling a Python object
    #  。python对递归做了限制1000层,否则无限的调用下去,不断的申请内存空间,直到内存溢出。
    # 了解python的递归层级
    
    
    import sys
    >>> sys.getrecursionlimit()  # 可以使用sys.getrecursionlimit()去查看递归深度,默认值为1000
     1000 
    >>> sys.getrecursionlimit(2000) # 可以自己定义对限制进行修改为2000,不建议这样做,容易造成内存溢出。
    >>> sys.getrecursionlimit()
    2000
    python不是一门函数式编程语言,无法对递归进行尾递归优化(了解)
    函数的递归:直接调用示意图:

    # 2、间接调用本身()
    def f1():
        print("===>f1")
        f2()
    
    def f2():
        print("===>f2")
        f1()
    
    f1()
    # RecursionError: maximum recursion depth exceeded while calling a Python object

    函数的递归:间接调用示意图:

    二、递归与循环
    # 递归与循环:递归的本质就是循环,递归能做的,while循环都能做。
    # 一段diamond循环的方案有两种
    # 方式一:while、for循环
    # while True:
    #     print(1111)
    #     print(2222)
    #     print(3333)
    # 这个不能停止
    
    # 方式二:使用递归
    def f1():
        print(1111)
        print(2222)
        print(3333)
        f1()
    
    f1()
    # RecursionError: maximum recursion depth exceeded while calling a Python object
    # 需要强调一点:
    # 1、递归不应该无限的调用下去,必须在满足某种条件下结束递归
    
    # 使用while循环:输出1-10的数据
    # n = 0
    # while n<10:
    #     print(n)
    #     n +=1
    
    # 使用递归:输出1-10的数据
    def f1(n):
        if n == 10:
            return
        print(n)
        n += 1
        f1(n)
    f1(0)

    三、回溯和递推

    # 递归两个阶段:回溯与递推
    
    # 回溯:一层一层的调用下去
    # 递推:满足某种结束条件后,结束递归调用,然后一层一层返回。
    
    # 举例:询问年龄
    # A比B大10岁,B比C大10岁,C比D大10岁,D比E大10岁,E为18岁  # 回溯:
    
    # age(5) = age(4) + 10
    # age(4) = age(3) + 10
    # age(3) = age(2) + 10
    # age(2) = age(1) + 10
    # age(1) = 18
    
    def age(n):
        if n == 1:
            return 18
        return age(n -1) + 10
    
    res = age(5)
    print(res)
    某公司四个员工坐在一起,问第四个人薪水,他说比第三个人多1000,问第三个人薪水,第他说比第二个人多1000,
    问第二个人薪水,他说比第一个人多1000,最后第一人说自己每月5000,请问第四个人的薪水是多少? 代码实现:
    def salary(n):
        if n == 1:
            return 5000
        return salary(n - 1) + 1000
    
    res = salary(4)
    print(res)
    思路解析:
    
    要知道第四个人的月薪,就必须知道第三个人的,第三个人的又取决于第二个人的,第二个人的又取决于第一个人的,
    而且每一个员工都比前一个多一千,数学表达式即:
    # salary(4)-->salary(3)+1000-->salary(2)+1000 + 1000-->salary(1)+1000+1000+1000-->5000+1000+1000+1000
    # salary(4)-->salary(3)+1000-->salary(2)+1000《==None+1000(TypeError: unsupported operand type(s) for +: 'NoneType' and 'int')《==5000+1000
    # TypeError: unsupported operand type(s) for +: 'NoneType' and 'int' 翻译:None类型和整型进行了加操作。
    # 解决办法:添加返回值return
    # salary(4) = 8000《==5000+1000+1000+1000《==5000+1000+1000《==5000+1000《==5000
    #                      salary(4)            salary(3)         salary(2)    salary(1)
    salary(4)=salary(3)+1000 
    salary(3)=salary(2)+1000 
    salary(2)=salary(1)+1000 
    salary(1)=5000
    总结为: 
    salary(n)=salary(n-1)+1000 (n>1) 
    salary(1)=5000 (n=1) 

    回溯和递推示意图如下:

      四、递归的应用

    # 需求:把如下列表的所有值取出来,并打印。
    # l = [1,2,[3,[4,[5,[6,[7,[8,[9,10,11]]]]]]]]
    
    # 方式一:使用循环实现需求
    # l = [1,2,[3,4]]
    # for x in l:
    #     if type(x) is list:
    #         # 如果是列表,应该再次循环,再次判读,再次打印,即重新运行本身的代码。
    #         for a in x:
    #             if type(a) is list:
    #                 pass
    #             else:
    #                 print(a)
    #     else:
    #         print(x)
    # 运行结果:1 2 3 4
    # 方式二:使用递归实现需求 l = [1,2,[3,4]] def f1(list1): for x in list1: if type(x) is list: # 如果是列表,应该再次循环,再次判读,再次打印,即重新运行本身的代码。 f1(x) else: print(x) f1(l) # 运行结果:1 2 3 4 5 6 7 8 9 10 11

     

  • 相关阅读:
    【Android进阶】关于PagerAdapter的使用方法的总结
    不容易系列之(4)——考新郎
    阿牛的EOF牛肉串
    Number Sequence
    盐水的故事
    Digital Roots
    密码 hdu
    不容易系列之(3)—— LELE的RPG难题
    冒泡排序----java实现
    不容易系列之一
  • 原文地址:https://www.cnblogs.com/liunaixu/p/12669995.html
Copyright © 2020-2023  润新知