zoukankan      html  css  js  c++  java
  • 函数递归

    函数递归

    函数递归值的是重复“直接或间接调用”函数本身,这是一种函数嵌套调用的表现形式

    直接调用:指的是在函数内置,直接调用函数本身

    特点:

    1.直接或者间接调用自身 2.具有结束条件,防止递归外溢 3.代码规模逐渐减少

    #在调用f1的过程中,又调用f1,这就是直接调用函数f1本身
    def f1():
        print('from f1')
        f1()
    f1()
    

    img

    间接调用:两个函数之间相互调用间接造成递归

    #在调用f1的过程中,又调用f2,而在调用f2的过程中又调用f1,这就是间接调用函数f1本身
    def f1():
        print('from f1')
        f2()
    def f2():
        print('from f2')
        f1()
    f1()
    

    img

    上面可以看到两种无限循环的过程,所以python中设置有递归默认深度(998/1000)目的为了限制递归次数

    #了解
    #1. 可以使用sys.getrecursionlimit()去查看递归深度,默认值为1000,虽然可以使用sys.setrecursionlimit()去设定该值,但仍受限于主机操作系统栈大小的限制
    
    #2. python不是一门函数式编程语言,无法对递归进行尾递归优化。
    

    回溯与递推

    想要递归有意义,必须遵循两个条件:

    回溯:
    当遇到终止条件,则从最后往回一级一级的把值返回来

    递推:
    递归每一次都是基于上一次进行下一次的执行

    def salary(n):
        if n == 1:
            return 5000
        return salary(n - 1) +1000
    s=salary(4)
    print(s)
    #解析
    当传入的实参为4时,函数体代码中的if判断语句不成立,所以直接返回salary(3)+1000
    然后依次类推,整个过程如下
    salary(4)=salary(3)+1000
    salary(3)=salary(2)+1000
    salary(2)=salary(1)+1000
    salary(1)=5000
    
    #递归本质就是在做重复的事情,所以理论上递归可以解决的问题循环也都可以解决,只不过在某些情况下,使用递归会更容易实现,比如有一个嵌套多层的列表,要求打印出所有的元素,代码实现如下
    
    items=[[1,2],3,[4,[5,[6,7]]]]
    def foo(items):
        for i in items:
            if isinstance(i,list): #满足未遍历完items以及if判断成立的条件时,一直进行递归调用
                foo(i) 
            else:
                print(i,end=' ')
        
    foo(items)
    #结果为
    1 2 3 4 5 6 7
    
  • 相关阅读:
    ionic框架
    第3课
    第7课
    第6课
    第5课
    第4课
    第3课
    第2课
    第2课
    第1课
  • 原文地址:https://www.cnblogs.com/a736659557/p/11893995.html
Copyright © 2011-2022 走看看