RuntimeError: maximum recursion depth exceeded 递归深度报错

Pyinstaller打包中的递归问题 总之,这个问题的根本原因在于程序中的递归调用层数过多,可能是因为模块的导入结构不当,导致递归嵌套太深,从而触发了 Python 的递归深度限制。采取上述解决方案,可以尝试增加递归深度限制,以便 PyInstaller 在递归导入模块时不会导致堆栈溢出。可以尝试追踪这个问题,创建一个最小化的示例代码,以便在 https://github.com/pyinstaller/pyinstaller/issues 提交一个问题报告,以获得更多帮助。Python限制了递归调用的最大深度,以防止无限递归导致堆栈溢出。 阅读详情

我想把Python中的递归作为一个专题讨论一下。我在学习的时候,尝试使用“Python递归”作为关键词,在Google和百度中搜索,发现结果大部分是对某个具体例子的递归应用讨论,而对我这样的小白来说,切入点有点高。而我现在需要做的,是从基础概念开始。

想到讨论递归问题,是因为那个著名的“字典序”问题,但还是先从最基本的递归概念开始。我希望我讨论完了这个,自己对递归也有一个基本的了解了。

递归的概念很简单,如果函数包含了对其自身的调用,该函数就是递归的。拗口一点的定义是,如果一个新的调用能在相同过程中较早的调用结束之前开始,那么个该过程就是递归。两个定义都来自《Python核心编程第二版》的第304页。

该书应用了一个经典的例子,来讲述递归的应用:

阶乘函数的定义是:
N! = factorial(N) = 1 * 2 * 3 * ... * N

那么可以用这种方法来看阶乘函数:
factorial(N) = N!
             = N * (N - 1)!
             = N * (N - 1) * (N - 2)!
             = N * (N - 1) * (N - 2) * ... * 3 * 2 * 1
             = N * factorial(N - 1)

于是我们有了阶乘函数的递归版本:

def factorial(n):
    if n == 0 or n == 1: return 1
    else: return (n * factorial(n - 1))

print factorial(6)

可以很轻易的得到,6!的结果是720。

上面就是这本书关于递归的内容了,但关于Python的递归不仅仅就这么一点知识吧?

来看看这个问题:

还是这个函数factorial(N),让我们试试N = 999和N = 1000,问题来了,N = 999时能输出正确答案,但当N = 1000时,就出现下面的错误了:
RuntimeError: maximum recursion depth exceeded
于是,请记住,默认的Python有一个可用的递归深度的限制,以避免耗尽计算机中的内存。在我的电脑,这是1000。

接着再来看看在我的第一个递归程序中遇到的问题:

为了试试手,我打算写一个简单函数计算那个传统的问题,1 + 2 + 3 + ... + 100,当然,必须使用递归来做:

我的脚本是这样的,结果出错了。

>>> def add(n):
...     if n > 0: return n + add(n - 1)
...
>>> add(100)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<stdin>", line 2, in add
  File "<stdin>", line 2, in add
  ...
  File "<stdin>", line 2, in add
TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'

上网问了之后,得知应该这样写这个脚本:
>>> def add(n):
... if n <= 0: return 0  
... if n > 0: return n + add(n - 1)
...     
>>> add(100)
5050

我本意想偷懒,在n小于等于零的时候,不返回任何东西。但Pyhton所做的和我想的却不一样。如果一个Python函数被设计成不返回任何东西,它会返回None。

这里插入一些关于递归的网方解释,因为我是从网上搜到的这些内容:
(1)递归就是在过程或函数里调用自身;
(2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

递归算法一般用于解决三类问题:
(1)数据的定义是按递归定义的。(比如Fibonacci函数)
(2)问题解法按递归算法实现。(回溯)
(3)数据的结构形式是按递归定义的。(比如树的遍历,图的搜索)   

递归的缺点:递归算法解题的运行效率较低。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。

【推荐】网文《精通递归程序设计》:
http://www.ibm.com/developerworks/cn/linux/l-recurs.html

递归程序的基本步骤,来自上面这篇文章

每一个递归程序都遵循相同的基本步骤: 
1.初始化算法。递归程序通常需要一个开始时使用的种子值(seed value)。要完成此任务,可以向函数传递参数,或者提供一个入口函数,这个函数是非递归的,但可以为递归计算设置种子值。 
2.检查要处理的当前值是否已经与基线条件相匹配(base case)。如果匹配,则进行处理并返回值。 
3.使用更小的或更简单的子问题(或多个子问题)来重新定义答案。 
4.对子问题运行算法。 
5.将结果合并入答案的表达式。 
6.返回结果。

基线条件(base case)。基线条件是递归程序的最底层位置,在此位置时没有必要再进行操作,可以直接返回一个结果。所有递归程序都必须至少拥有一个基线条件,而且必须确保它们最终会达到某个基线条件;否则,程序将永远运行下去,直到程序缺少内存或者栈空间。

自己总结了一下,要写一个递归的程序,需要这样做:
1.一个基线条件。请在递归函数的一开始就处理这个基线条件。
2.一系列的规则,使对递归函数的每次调用都趋进于直至达到这个基线条件。

好吧,现在看来,基本概念已经差不多了,在回到“字典序”问题之前,先看看这个全排列的问题。题目要求很简单,输入n个数,能自动打印出全排列(Permutation)。比如输入1,2,3,那它的全排列就是123,132,213,231,312,321。

 

 

RuntimeError: maximum recursion depth exceeded

  在网上查了,发现python默认的递归深度是很有限的,大概是900多的样子,当递归深度超过这个值的时候,就会引发这样的一个异常。

解决的方式是手工设置递归调用深度,方式为

 

  1. import sys   
  2. sys.setrecursionlimit(1000000) #例如这里设置为一百万  
RuntimeError: maximum recursion depth exceeded while getting the repr of an object threading.Timer格式写错。 例如: timers[seq] = threading.Timer(time_limit, send_pkt()) 应该改成: timers[seq] = threading.Timer(time_limit, send_pkt) 再如: timers[seq] = threading.Timer(time_limit, send_pkt(seq, d... 阅读详情

相关推荐

成功解决RecursionEror:maximum rcusion depth exceded in comprison异常的有效解决方法

成功解决RecursionEror:maximum rcusion depth exceded in comprison异常的有效解决方法

wbajsjhhhhh的博客 3817

python maximum recursion depth exceeded解决方式

用Python写了一个递归脚本,脚本如下   def fact(n): return fact_iter(n, 1) def fact_iter(num, product): if num == 1: return product return fact_iter(num - 1, num*product) 执行:fact(1000)   ...

youzhouliu的博客 11万+

python递归深度报错--RuntimeError: maximum recursion depth exceeded

代码上传至https://github.com/gatieme/AderXCoding/blob/master/python/error/depth-exceeded.py 问题 这段时间用Python写了一个爬虫脚本,在抓取页面采用广度优先遍历抓取。但是当遍历到1000左右时就会出现莫名其妙的错误,  通过pdb调试发现是: RuntimeError: maximum recursi...

wenyusuran的专栏 3876

【python】Python报错:RecursionError: maximum recursion depth exceeded in comparison

今天在用python写一个递归查询数据库的程序时,报了一个错误: 错误的大致意思就是查询过相关文档和资料后才发现了问题原因,python的递归深度是有限制的,默认为1000。当递归深度超过1000时,就会报错。可以将递归的深度修改的大一些,即可解决问题,但是还是建议在程序中不要使用太深的递归层数。 4. 补充测试 由于对最大递归层数产生兴趣,于是我在自己电脑上用以下代码做了测试: 在,再执行上面的代码,发现最多也只是。 系统为了保证自己不会内存溢出,把它关了。要不然就是Python为了保证电脑不会****,

qq_43331089的博客 3万+

RuntimeError: maximum recursion depth exceeded

RuntimeError: maximum recursion depth exceeded 然后长时间运行后出现 RuntimeError: maximum recursion depth exceeded,之后去stackoverflow查发现是python自身的递归深度是999,也就是最多支持return get_detail 999次,import sys sys.setrecu

jacke121的专栏 2821

Ultrascale/Ultrascale+ FPGA GTH IP及结构详解(一)

FPGA GTH Transceiver

houzi6320的博客 1万+

python递归深度报错: RuntimeError: maximum recursion depth exceeded

这段时间用Python写了一个爬虫脚本,在抓取页面采用广度优先遍历抓取。但是当遍历到900多时就会出现莫名其妙的错误,通过pdb调试发现是:RuntimeError: maximum recursion depth exceeded在网上查了,发现python默认的递归深度是很有限的,大概是900多的样子,当递归深度超过这个值的时候,就会引发这样的一个异常。解决的方式是手工设置递归调用深度,方式为i

iMeta 1372

手把手式介绍 ADNI 影像数据下载

1.搜索 1.1登录 打开ADNI的官网:http://adni.loni.usc.edu/,进入下面的界面。 点击 DATA&SMPLES 下的 ACCESS DATA AND SAMPLES,如下图。 页面跳转以后点击中间的“LOGIN”,这时会跳出一个新的界面,然后在右上角输入自己的帐号、密码即可。如果没有权限可以跳转到第2部分看看如何申请权限。 登录以后选择DOWNLOAD下的 Image Collections就是搜索下载影像数据,其他还有一些学习测试数据和遗传数据。 1.2 sea

永远想不起来更新的博客 1万+

【Python】解决Python报错:RuntimeError: maximum recursion depth exceeded in comparison

解决Python报错:RuntimeError: maximum recursion depth exceeded in comparison

科技改变人类,技术成就未来 1188

【Flink cdc】Data row is smaller than a column index, internal schema representation is probably xxx

翻译一下:当scan.startup.mode=EARLIEST_OFFSET时,如果在最早的offset之后表结构有过变化就无法支持。原因应该是在binlog 的earliest_offset之后,表结构被修改过。我的解决方案:source配置中使用。mysql source配置使用。,以时间戳为消费依据。

integrity 2085

手把手教你用VCS+Verdi在Linux下仿真蜂鸟E203 RISC-V核(附波形调试技巧)

本文详细介绍了在Linux环境下使用VCS和Verdi工具链对蜂鸟E203 RISC-V核进行仿真验证的完整流程。从环境配置、工程结构解析到VCS编译优化和Verdi波形分析技巧,提供了实战性强的调试方法和性能优化策略,帮助工程师高效完成数字IC验证工作。

weixin_42531163的博客 416

解决RuntimeError: maximum recursion depth exceeded递归异常

/ 前言 /        不久前写了一个脚本检测Linux某一个服务是否是启动状态, 因为服务启动时间较长就加了一个递归操作, 结果报错RuntimeError: maximum recursion depth exceeded, 我们来看下如何解决 / 1 / 问题分析        问题出现后我去网上查找发现报错原因是递归次数超过了Python3.x的默认递归深度, 那么我

欢迎来到wise哲的博客空间 3557

jenkins安装、打包、部署

一个可以让小白部署发布项目的软件;git 配置 一定要配置git的命令路径jenkins启动命令,一定要加这一段 -Dhudson.util.ProcessTree.disable=true一定要配置jenkins的节点,BUILD_ID和DONTKILLME 否则会导致打包后,会将运行的java程序进程也杀死创建任务SSH中执行服务器B的命令的时候,cd /opt;一定要cd 打开那个目录,否则文件无法传输过去。

学海无涯,我用JAVA 5217

Python RuntimeError: maximum recursion depth exceeded in cmp 超过最大递归深度错误

说明:Python运行版本Python2.7.12 最近写了个Python爬虫,运行时出现 RuntimeError: maximum recursion depth exceeded in cmp 错误,上网查资料发现Python遍历深度在最大1000,超过就会报错! 写个程序测试下: #coding=utf-8 import sys def func(depth): depth

xfyangle的博客 6530

[cryoEM] cryoSPARC简介

cryoSPARC系统结构概述 cryoSPARC是一个后端和前端高性能计算软件系统,为单颗粒冷冻电镜提供数据处理和图像分析能力,以及丰富的基于浏览器的用户截面和命令行工具。 Master-worker模式 系统基于主用户模式。 主进程(web应用,核心应用程序和MongoDB数据库)一起在主节点上运行。主节点需要相对轻量级的资源(2+ CPU< 16GB+ RAM)。 工作程序进程可以在具有GPU的任何可用节点上生成,负责所有实际计算和数据处理,并由主节点调度。注意:同一节点可以同时充当主节点和辅

进阶中的程序员吃吃的博客 7797

医疗数据采集:Python爬虫爬取医学文献与药品信息(2026合规与伦理版)

医疗数据采集不同于爬取新闻或房价,它直接关系到人的生命健康和法律底线。技术层面:优先使用官方 API (PubMed E-utilities, BioThings),避免解析复杂HTML。法律层面:严守“不碰隐私、不破付费、不传谣言”三条红线。伦理层面:保持对生命的敬畏,确保数据的准确性和用途的正当性。在2026年,一个优秀的医疗数据工程师,不是那个能爬取最多数据的人,而是那个能在合规框架下,利用公开数据解决真实医疗问题的人。请务必珍视您的职业生涯和法律责任,切勿以身试法。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 284

win10启动django项目报错 Django RuntimeError: maximum recursion depth exceeded

来源自我的博客 错误:Django RuntimeError: maximum recursion depth exceeded原因出自python\Lib\fuctools.py 把convert = { '__lt__': [('__gt__', lambda self, other: other < self), ('__le__', lambda

陈止风的博客 2115

如何卸载Gazebo与重装

gazebo是一款关于车辆和无人机的仿真软件,本文大致介绍它是何物,以及他的安装和卸载方法,对于ROS开发者,本文有一定参考意义。

gongdiwudu的专栏 1万+

python 最大递归次数 RuntimeError: maximum recursion depth exceeded

python默认的递归深度是很有限的,大概是900多的样子,当递归深度超过这个值的时候,就会引发这样的一个异常。RuntimeError: maximum recursion depth exceeded. def recursion(n): if (n <= 0): return print (n) recursion(n - 1) #window下...

qq_24822271的博客 577

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

启动django的服务时候报错RuntimeError: maximum recursion depth exceeded in cmp

启动django的服务时候报错RuntimeError: maximum recursion depth exceeded in cmp

小青蛙 885

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

上一篇: Python 绝对简明手册
下一篇: 浅析Python中的Python全局变量
Relaxing
博客等级 码龄17年 2粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值