函数六---递归函数
在函数内部,可以调用其他函数。如果一个函数在内部调用它自身,那么这个函数就是递归函数。
如阶乘 n! = 1 x 2 x 3 x ... x n,用函数func(n)
表示,可以看出:
func(n) = n! = 1 x 2 x 3 x ... x (n-1) x n = (n-1)! x n = func(n-1) x n
所以,func(n)
可以表示为n x func(n-1)
,只有n=1时需要特殊处理。
于是,func(n)
用递归的方式写出来就是:
def func(n): if n == 1: return 1 return func(n - 1) * n print(func(5)) # 120 print(func(3)) # 6
递归函数的优点:会让代码简单,逻辑清晰。
递归函数的缺点:占内存,过深的调用会导致栈溢出
使用递归函数需要注意防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
最大递归深度默认是997/998
# import sys # print(sys.setrecursionlimit(100000)) #可以通过上面两句去修改默认值,至于实际可以达到的深度就取决于计算机的性能了 import sys sys.setrecursionlimit(1000000) n = 0 def story(): global n n += 1 print(n) story() story() # 如果递归次数太多,就不适合使用递归来解决问题
n = 0 def story(): global n n += 1 print(n) story() story()