修正了文档中的公式
parent
a0dfdffef9
commit
d2b314124c
|
@ -206,7 +206,7 @@ upload('Python从入门到住院.pdf')
|
|||
|
||||
### 递归调用
|
||||
|
||||
Python中允许函数嵌套定义,也允许函数之间相互调用,而且一个函数还可以直接或间接的调用自身。函数自己调用自己称为递归调用,那么递归调用有什么用处呢?现实中,有很多问题的定义本身就是一个递归定义,例如我们之前讲到的阶乘,非负整数$N$的阶乘是$N$乘以$N-1$的阶乘,即$N!=N\times(N-1)!$,定义的左边和右边都出现了阶乘的概念,所以这是一个递归定义。既然如此,我们可以使用递归调用的方式来写一个求阶乘的函数,代码如下所示。
|
||||
Python中允许函数嵌套定义,也允许函数之间相互调用,而且一个函数还可以直接或间接的调用自身。函数自己调用自己称为递归调用,那么递归调用有什么用处呢?现实中,有很多问题的定义本身就是一个递归定义,例如我们之前讲到的阶乘,非负整数`N`的阶乘是`N`乘以`N-1`的阶乘,即`N! = N * (N-1)!`,定义的左边和右边都出现了阶乘的概念,所以这是一个递归定义。既然如此,我们可以使用递归调用的方式来写一个求阶乘的函数,代码如下所示。
|
||||
|
||||
```Python
|
||||
def fac(num):
|
||||
|
@ -236,7 +236,7 @@ print(fac(5)) # 120
|
|||
|
||||
我们使用的Python官方解释器,默认将函数调用的栈结构最大深度设置为`1000`层。如果超出这个深度,就会发生上面说的`RecursionError`。当然,我们可以使用`sys`模块的`setrecursionlimit`函数来改变递归调用的最大深度,例如:`sys.setrecursionlimit(10000)`,这样就可以让上面的`fac(5000)`顺利执行出结果,但是我们不建议这样做,因为让递归快速收敛才是我们应该做的事情,否则就应该考虑使用循环递推而不是递归。
|
||||
|
||||
再举一个之前讲过的生成斐波那契数列的例子,因为斐波那契数列前两个数都是`1`,从第3个数开始,每个数是前两个数相加的和,可以记为$f_n=f_{n-1}+f_{n-2}$,很显然这又是一个递归的定义,所以我们可以用下面的递归调用函数来计算第$n$个斐波那契数。
|
||||
再举一个之前讲过的生成斐波那契数列的例子,因为斐波那契数列前两个数都是`1`,从第3个数开始,每个数是前两个数相加的和,可以记为`f(n) = f(n - 1) + f(n - 2)`,很显然这又是一个递归的定义,所以我们可以用下面的递归调用函数来计算第`n`个斐波那契数。
|
||||
|
||||
```Python
|
||||
def fib(n):
|
||||
|
|
Loading…
Reference in New Issue