Python递归函数
什么是递归?
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
递归的特性:
-
递归函数必须有一个明确的结束条件。
-
每进入更深一层的递归时,问题规模相对于上一次递归都应减少。
-
相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入)。
-
递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
递归实现
构建一个递归函数用来计算乘阶
def fact(n): if n == 1: return n else: return n * fact( n-1 )
print(fact(3))
原理:
fact(3) 3 * fact( 3-1 ) 3 * (2 * fact( 2-1 )) 3 * (2 * 1)
3 * 2
6
优缺点分析
虽然有代码简洁的优点,但是时间和空间消耗比较大。每一次函数调用都需要在内存栈中分配空间以保存参数,返回地址以及临时变量,而且往栈里面压入数据和弹出都需要时间。
另外递归会有重复的计算。递归本质是把一个问题分解为多个问题,如果这多个问题存在重复计算,有时候会随着n成指数增长。斐波那契的递归就是一个例子。
递归还有栈溢出的问题,每个进程的栈容量是有限的。