python递归是什么意思_Python——谈谈递归的深度问题

前言:

用过python递归的同学可能都碰到过:RecursionError: maximum recursion depth exceeded while getting the str of an object,显而易见超过递归深度了,那么python的递归深度到底是多少呢?有没有一个标准呢?今天来简单聊聊python的递归深度问题;否则老板给了一个需求,还需要犹豫半天到底要不要用递归解决,个人觉得是否用递归思考两点即可,一这个逻辑是业务最大复杂度是多少,第二服务器设备环境,为什么这样说下面一起讨论下;

递归深度讨论:

问题一:递归的理论深度:

在计算机系统上根据计算机性能,是有默认递归深度的;根据机器性能不同可能会有一个不同递归深度(之所以这样说,是因为看大家众说纷纭我也没有那么多机器实测,但是我看到python告诉我的默认递归深度是1000--注意是默认递归深度,那些手动修改了的勿喷,具体上图为证吧)

虚拟机内核是一个cpu,内存1024剩下是我本地的都告诉是1000,那么问题来了真的是1000吗?我觉得需要测试一把;

问题二:递归实际深度:

使用类斐波那契数列进行实测:

编写代码:

def fib(n):

if n ==1:

return 1

else:

return fib(n-1)+n

本地实测结果:python2 都可以递归计算到999,但是python3只能递归到998,上图为证,应该不存在有人说你一台电脑上测的疑问吧,虚拟机先开的3后开的python2,本地物理内存占用率查看后本地顺序刚好相反执行的;

递归问题第一阶段验证结束后,疑问又来了,递归的上限可以调整吗?调整后上限又是多少?

问题三:递归上限可以调整吗?当然可以;

import sys

sys.setrecursionlimit(设置上限值)

使用上述代码就可以调整;

接下来我们做一个初步调整:先调整到有争议的数字3000,验证一下:

为了以示清白设置生效后上图:

可以看到已经生效,下面开始验证:

我的机器上都是到临近值时候开始报错超出最大深度的,python2能到2999,但是3总是比python2少一个值;

然后问题又来了,python的递归真的这么垃圾超不过3000大关,结论是否如此一起验证一下:

问题四:尝试验证python递归最大深度(验证1万深度):

验证结果上图片:

可以看到,也是同样在接近设置的极限值时候都是会报错的,但是记住3版本总是比2版本先报错,而且python的递归深度是可以上万的,只要你有资源,至于具体最大上限我也不能真把我本地电脑跑挂;

使用虚拟机小测一把单核的Ubuntu1G运行内存深度是没法超过5万的,所以最终这个数字取决于计算机本身的计算能力和Python的版本,如果超过系统堆栈深度,Python无法支撑也就奔溃了。同样的PC,Python的版本不同,这个值都有差异。有的时候差异还很大。

所以当你的复杂度特别大请放弃递归,或者请优化递归算法;

写完后顺道回顾了下斐波那契数列,赶紧来承认一下错误:我的斐波那契数列写的有问题;本篇只做递归深度,修正斐波那契数列写法:

def fib_real(n):

if n <= 2:

return 1

else:

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

#大佬勿喷哈,请谅解

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值