我是靠谱客的博主 幸福画笔,最近开发中收集的这篇文章主要介绍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)

#大佬勿喷哈,请谅解

最后

以上就是幸福画笔为你收集整理的python递归是什么意思_Python——谈谈递归的深度问题的全部内容,希望文章能够帮你解决python递归是什么意思_Python——谈谈递归的深度问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(51)

评论列表共有 0 条评论

立即
投稿
返回
顶部