From d2b314124c58f7d4e1cefcfd29fcdc95cb275816 Mon Sep 17 00:00:00 2001 From: jackfrued Date: Tue, 5 May 2020 19:48:25 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=BA=86=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E5=85=AC=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 第021课:函数的高级应用.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/第021课:函数的高级应用.md b/第021课:函数的高级应用.md index d3738e8..c981e6e 100644 --- a/第021课:函数的高级应用.md +++ b/第021课:函数的高级应用.md @@ -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):