python递归函数讲解_Python系列教程(二十四):递归函数

一、递归函数

1、什么是递归函数

函数体内可以调用其他函数,既然这样,那么可不可以函数自己调用自己呢?答案是可以的,函数通过直接或者间接调用自身,就是递归函数(Recursion)。

1553480983480254.png

2、使用递归函数的条件

① 递归函数一定要有边界条件

跟我们的循环有点类似,必须要有退出条件,不然就是死循环,而递归要是没有退出条件,就是无限递归,像上面那个图一样,走进了无尽深渊,永远出不来。

② 递归的深度也不宜过深

因为很消耗资源,所以Python对递归调用的深度做了限制,一是保护资源,二是可以防止无限递归。在python 3.x中,默认是3000,可以通过sys.getrecursionlimit()查看 ,如果超出了这个限制,会抛出异常‘RecursionError: maxinum recursion depth exceeded’。也不建议去修改这个值,毕竟python这么设置也是有道理的。

3、递归函数的性能

递归函数的运行效率其实不高,因为每一次调用都需要开辟栈帧,都要压栈弹栈,递归次数不高的话,可能消耗不大,但是递归函数一般都需要执行很多次的,所以多次的累计,就有很大的性能损耗。

4、简单的递归函数例子

如果对当初上学时学数学还有那么一点印象的话,应该还能依稀记得有一些数学公式,比如F(n)=F(n-1)+F(n-2),今天,我们将从程序员的身份,开发人员的角度再去解析这个数学公式。

先来认识一下什么叫做斐波那契数列,简单的解释就是,后面的数值等于前面两个数值之和,下面是一段斐波那契数列:

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …

如果通过数学公式来表达这个数列,那么可以写成:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)

如果从函数的角度去考虑这个表达式,应该怎么实现呢?

我们把一个数学公式拆分3部分,F(n)这种格式不就是一个函数调用么,然后‘=’不就一个函数的返回值么,而F(n-1)+F(n-2)不就是又调用自身函数么,这就是递归函数,所以可以直接写成下面这种格式:

def F(n):

if n < 2:

return 1

else:

return F(n-1) + F(n-2)

5、使用调试代码手段分析递归函数执行流程

我们就以斐波那契数列为示例,并且为了容易理解,我们一开始就不要递归那么多次,可以慢慢递增。

第一次调试:

① Frames:调用F(2)函数,所以把F函数压栈,并且执行‘return F(n-1) + F(n-2)’语句

② Variables:n = 2

1553484533226300.png

第二次调试:

① Frames:由于第一次调用函数执行‘F(1)+F(0)’,会先执行F(1),所以会把F函数再次压栈

② Variables:n = 1

1553484654606654.png

第三次调试:

① Frames:可以看到栈中,又只剩下一个F函数了,因为F(1)执行完成之后,就弹出栈了

② Variables:n = 2

1553484992285864.png

第四次调试:

① Frames:可以看到栈中,又把F函数压入栈中,因为轮到F(0)开始执行了

② Variables:n = 0

1553485096836351.png

第五次调试:

① Frames:可以看到栈中,又只剩下一个F函数了,因为F(0)执行完成之后,就弹出栈了

② Variables:n = 2

1553485173345305.png

6、递归函数的总结

① 递归函数是一种很自然的表达,可以直接反映到我们所学的数学公式上

② 递归函数在些应用场景上非常适用,可以以非常精简的代码完成复杂功能

③ 但是能不用则不用递归,一是运行效率不高,二是因为绝大数的递归,都能用循环实现

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值