测开之函数进阶· 第1篇《递归函数》 (2)

Pycharm 有个检测机制: 当它内部检测到这个是个无限递归,没有递归临界点的一个递归函数,那么这个时候,它递归多少次之后,会自动给终止了。

使用递归函数的时候,一定要注意一个点:就是一定要设置递归的边界。递归的边界就是递归函数的终止条件。

如果你不设置递归边界,那么你定义的递归函数就是个死循环,一直无限得调用自身。

4.通过递归函数实现的任意数的阶乘 4.1 什么是阶乘? 1 的阶乘 1
2 的阶乘   1 * 2  
3 的阶乘   1 * 2 * 3  
4 的阶乘   1 * 2 * 3 * 4  

递归能实现的,通过循环都能实现。

Python 中递归用得不多,不太建议使用递归,因为递归不太好用,用递归还不如用循环。

4.2 怎么去算阶乘呢?

定义个函数,算任意数的阶乘。传 1,就算 1 的阶乘,传 10 就算 10 的阶乘。

可以这样做:

首先要判断下它传进来的这个参数是不是等于 1,如果是等于 1 的话,就直接给它return返回出去。然后,如果它不等于 1 的话,就返回return n * (n-1)*(n-2)。

n 传进来是 1,那应该返回 1;如果传的是 2,应该返回return n * (n-1)。

 测开之函数进阶· 第1篇《递归函数》

如果在这里用递归函数,调用func(1)。那么这个时候,这个func(1)调用递归函数。

这个函数返回的是什么?

调用这段代码:

if n == 1: return 1

返回的是个 1。

将代码修改成如下:

def fun(n): if n == 1: return 1 else: return n * fun(n-1) fun(3)

如果是fun(3),3 传进来:

def fun(n): if n == 1: return 1

肯定是不成立的。

else后面的代码return n * fun(n-1)。

这里的 n 是个 3,fun(n-1)就是fun(2),那么就是3 * fun(2)。

这个时候会再次调用自身这个函数:

 测开之函数进阶· 第1篇《递归函数》

这个时候 n 是什么?

fun(2)的时候 n 是个 2,就是3 *2* fun(1)。 fun(1)再执行下,出来的结果是个 1。那这里就是个 1,就是3*2*1。

等于 3 的时候,返回的结果就是3*2*1。

4.3 改成fun(4)看看:

首先 4 进来,n 等于 4,fun(n-1)就是fun(3)。调用fun(3)就相当于再次调用fun(n),就是4 *3* fun(2)。

再次调用fun(2),再进来,前面return n * fun(n-1)这一截得到 2,fun(3-1)得到 2,所以最终得到4*3*2* fun(1)。

fun(1)调用,结果出来就是个 1。就是4*3*2*1。

def fun(n): if n == 1: return 1 else: return n * fun(n-1) # 4 *3*2*1 fun(4) 5.这个递归函数的递归临界点在哪? if n == 1: return 1

当n=1的时候就不会调用自身了。当满足某个条件,不再调用自身,那么这个就被称为递归临界点。

例如改成n==-1

if n == -1: return 1

这个时候,这个函数的递归临界点在哪?

这个递归临界点就是-1。

def fun(n): if n == -1:# 递归临界点:当达到递归临界点的时候,就不再调用自身函数的条件 return 1 else: return n * fun(n-1) # 4 *3*2*1 fun(4)

任何递归函数,它的原理都是一样的。定义一个递归函数,在递归函数里面它其实就是不断得调用自身,然后设置递归函数的时候,一定不能忘了递归条件。

6.斐波那契数列

后面的数都是等于前 2 个数相加的结果。

斐波那契数列的第一个数值是 1,第二个数值也是个 1,第三个数等于前两个数相加的结果(那就是 2),第四个数等于于前两个数相加的结果(那就是 3)。

[1,1,2,3,5]

以此类推。

三、系列推荐

测开入门篇《环境管理、编码规范、项目结构》

数据类型· 第 1 篇《元组和列表的性能分析、命名元组》

数据类型第 2 篇「字典和集合的原理和应用」

测开之数据类型· 第 3 篇《列表推导式、字典推导式、2 种方式创建生成器》

测开之数据类型· 第 4 篇《迭代器、生成器》

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzfjg.html