1.求阶乘
计算阶乘n! = 1 x 2 x 3 x … x n,
可以用函数fact(n)表示。
- fact(n) = n! = 1 x 2 x 3 x … x (n-1) x n = (n-1)! x n = fact(n-1) x n
fact(n)可以表示为n x fact(n-1),只有n=1时需要特殊处理。
于是,fact(n)用递归的方式写出来就是:
- def fact(n):
- if n == 1:
- return 1
- return n * fact(n – 1)
如果计算fact(6),可以根据函数定义看到计算过程如下:
- def fac(n):
- if n==1:
- return 1
- else:
- res=n*fac(n-1)
- return res
- print(fac(6))
2.斐波拉契级数
有这样一个数列:1,1,2,3,5,8,13,21,34…。其第一元素和第二个元素等于 1,其他元素等于其前面两个元素的和。
例:
- def fab(n): # 定义斐波拉契级数
- if n in [1, 2]: # 如果n=1或者2
- return 1
- return fab(n – 1) + fab(n – 2) # n>2
- print(fab(1)) # 斐波拉契级数的第一个元素
- print(fab(2)) # 斐波拉契级数的第二个元素
- print(fab(8)) # 斐波拉契级数的第8个元素
- print(fab(13)) # 斐波拉契级数的第9个元素
运行结果:
3.递归函数的优点
定义简单,逻辑清晰。理论上,所有的递归函数都可以写成循环的方式,但循环的逻辑不如递归清晰。
递归需要注意递归的深度。由于递归会产生多次函数调用,而函数调用会消耗代码的栈空间,如果递归的深度太大,会导致栈溢出。以上面的阶乘为例,如果计算 100000 的阶乘,在一般机器上都会出现栈溢出的问题。
- print(fac(10000))