函数递归

函数递归

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

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

特点:

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
原文地址:https://www.cnblogs.com/a736659557/p/11893995.html