函数六---递归函数

在函数内部,可以调用其他函数。如果一个函数在内部调用它自身,那么这个函数就是递归函数。

如阶乘  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()
# 如果递归次数太多,就不适合使用递归来解决问题
View Code

 

n = 0
def story():
    global n
    n += 1
    print(n)
    story()
story()
View Code

 

posted @ 2018-01-08 18:05  笨笨侠  阅读(142)  评论(0编辑  收藏  举报