函数执行流程:压栈 一层压一层
递归Recursion:函数直接或者间接调用自身就是递归,递归需要有边界条件,递归前进段,递归返回段,递归一定一定要有边界条件,不然很容易崩溃
#递归函数举例 计算斐波那契数列‘
def fib(n):
if n < 3: #这里就是递归的边界 当n小于5就return退出
return 1
return fib(n-1) + fib(n-2) #这里就是自己调用自己 一层层下去 到底然后一层层返回
print(fib(5)) # 打印 5 n传的数如果很大效率就很慢
递归要求:递归一定要有退出条件,递归调用一定要执行到条件退出。如果没有退出条件的递归调用,就是无限调用,直到崩溃
递归调用的深度不宜过深,python对递归调用的深度做了限制,用以保护解释器,当递归调用超过深度限制时,就会抛出RecursionError:maxinum recursion depth exceeded 超出最大深度的错误
调用import sys 用sys.getrecursionlimit()可以查看解释器最大的调用深度
递归的性能:循环稍微复杂一些,但是只要不是死循环,可以多次迭代直到算出结果,斐波那契函数的代码极简易懂,但是只能回去最外层的函数调用,而且给定一个n都要进行近2n次的递归,递归调用深度越深,效率越低,递归还有深度限制,如果递归复杂,函数反复压栈,栈内存很快就会溢出
递归总结:
递归的练习题:
第一:用递归求n的阶乘
def fn(n):
if n == 1: #递归的边界条件
return 1
return n * fn(n - 1) #递归进去计算 自己调用自己
print(fn(5))
第二:将一个数逆序打印
def rev(x, tar = None):
if tar == None: #判断tar是不是None 如果是 则追加一个空列表
tar = []
x, y = divmod(x, 10) # 这里的divmod作用是 x / 10 然后x, y 解构 x拿到商(1234) y拿到余数(5)
tar.append(y) #将5追加进列表
if x == 0:
return tar
return rev(x, tar)
print(rev(12345)) #传入12345
第三:解决猴子吃桃问题
def fn(n):
if n == 1:
return 1
return (fn(n-1)+1) * 2
print(fn(10))