在函数内部,可以调用其他函数。如果一个函数在内部调用本身,这个函数就是递归函数。比如计算阶乘n! = 1 x 2 x 3 x ... x n
,用函数func(n)
表示,于是,func(n)
用递归的方式写出来就是:
def func(n): if n == 1: return 1 return func(n-1)*nprint(func(5))
具体过程:
次数 | n | func() | 值 |
1 | 5 | func(4)*5 | 120 |
2 | 4 | func(3)*4 | 24 |
3 | 3 | func(2)*3 | 6 |
4 | 2 | func(1)*2 | 2 |
5 | 1 | return 1 | 1 |
递归函数的优点是定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。但是需要注意的是防止栈溢出。在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
递归例子:
1 def move(n, a, b, c):2 if n == 1:3 print('move', a, '-->', c)4 else:5 move(n-1, a, c, b)6 move(1, a, b, c)7 move(n-1, b, a, c)8 9 move(4, 'A', 'B', 'C')
1 def fbi(n):2 if n == 1:3 return 14 elif n == 0:5 return 06 elif n >= 2:7 return fbi(n-1)+fbi(n-2)8 print(fbi(8))