递归函数
定义
在函数内部自己调用自己的函数,成为递归函数
特性
递归函数的特性:
-
必须有一个明确的条件
-
每次进入更深一层递归时,问题规模相比上次应有所减少
-
相邻两次之间有紧密的联系,前一次为后一次做好准备
<!--注:通常前一次输出为后一次输入-->
-
递归效率不高,递归层数过多会导致栈溢出
<!--栈溢出:在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每进入一个调用,会增加一层栈帧,每当函数返回,会减少一层栈帧。由于栈的大小不是无限的,所以,递归调用次数过多,会导致栈溢出-->
例子
简单例子
def func(n):
if n == 1:
return 1
return n * func(n - 1) # 调用自己
ret = func(5)
print(ret)
执行结果:
120
ret1 = func(1000)
print(ret1)
报错:
RecursionError: maximumrecursiondepthexceeded in comparison
# 数字过大,导致超出递归深度,导致栈溢出
栈溢出解决方法:
解决递归调用栈溢出的方法是尾递归优化,实际上,尾递归优化和循环是一样的,所以循环也可以是尾递归优化的特殊形式.
尾递归
def func1(n, product=1)
if n == 1:
return product
return func1(n-1,product*n)
<!--python不支持尾递归-->
尾递归优化:http://www.open-open.com/lib/view/open1480494663229.html