广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python栈溢出
  • 602
分享到

Python栈溢出

Python 2023-01-31 01:01:43 602人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

python3.5.4 递归函数最恶心的时候莫非栈溢出(Stack overflow)。 如何解决? 人为设置递归深度 使用python写的递归程序如果递归太深, 那么极有可能因为超过系统默认的递归深度限制而出现错误。一般默认

python3.5.4
递归函数最恶心的时候莫非栈溢出(Stack overflow)。

如何解决?

人为设置递归深度

使用python写的递归程序如果递归太深, 那么极有可能因为超过系统默认的递归深度限制而出现错误。一般默认递归长度在1000左右。
RuntimeError: maximum recursion depth exceeded in comparison

显然此时我们可以人为修改

import sys
sys.setrecursionlimit(1000000) #括号中的值为递归深度

尾递归优化

注:这只是一种思维的科普
解决递归调用栈溢出的另一种方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。

尾递归是指,在函数返回的时候,调用自身本身,并且,return语句不能包含表达式。这样,编译器或者解释器就可以把尾递归做优化,使递归本身无论调用多少次,都只占用一个栈帧,不会出现栈溢出的情况。

上面的fact(n)函数由于return n * fact(n - 1)引入了乘法表达式,所以就不是尾递归了。要改成尾递归方式,需要多一点代码,主要是要把每一步的乘积传入到递归函数中:

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)

可以看到,return fact_iter(num - 1, num * product) 仅返回递归函数本身,num - 1和num * product在函数调用前就会被计算,不影响函数调用。

fact(5)对应的fact_iter(5, 1)的调用如下:

===> fact_iter(5, 1)
===> fact_iter(4, 5)
===> fact_iter(3, 20)
===> fact_iter(2, 60)
===> fact_iter(1, 120)
===> 120

尾递归调用时,如果做了优化,栈不会增长,因此,无论多少次调用也不会导致栈溢出。

遗憾的是,大多数编程语言没有针对尾递归做优化,Python解释器也没有做优化,所以,即使把上面的fact(n)函数改成尾递归方式,也会导致栈溢出。

Python标准的解释器没有针对尾递归做优化,任何递归函数都存在栈溢出的问题

小结

方法一:人为修改默认递归长度
方法二:人为修改python解释器,将其优化,会十分有趣

如果您看到这篇文章有收获或者有不同的意见,欢迎点赞或者评论。
python群:190341254
丁。

--结束END--

本文标题: Python栈溢出

本文链接: https://www.lsjlt.com/news/184696.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python栈溢出
    python3.5.4 递归函数最恶心的时候莫非栈溢出(Stack overflow)。 如何解决 人为设置递归深度 使用python写的递归程序如果递归太深, 那么极有可能因为超过系统默认的递归深度限制而出现错误。一般默认递...
    99+
    2023-01-31
    Python
  • python如何防止栈溢出
    这篇文章将为大家详细讲解有关python如何防止栈溢出,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、说明使用递归函数的优点是逻辑简单明了,缺点是调用过深会导致栈溢出。解决递归调用栈溢出的方法是栈溢出问...
    99+
    2023-06-15
  • 解决python递归栈溢出
    使用python写的递归程序如果递归太深, 那么极有可能因为超过系统默认的递归深度限制而出现 RuntimeError: maximum recursion depth exceeded in comparison 的错误, 解...
    99+
    2023-01-31
    递归 python
  • python怎么防止栈溢出
    这篇文章主要介绍python怎么防止栈溢出,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、说明使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和...
    99+
    2023-06-15
  • 详解JVM栈溢出和堆溢出
    一、栈溢出StackOverflowError 栈是线程私有的,生命周期与线程相同,每个方法在执行的时候都会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口等信息。 栈...
    99+
    2022-11-12
  • java.lang.StackOverflowError: null(栈内存溢出)
    StackOverflowError在程序栈空间耗尽时抛出,通常是深度递归导致,出现栈内存溢出,查询了网上的资料,一般来说出现栈溢出的情况有: service层忘了加@Service注解 service层忘了加@Autowired注解 ...
    99+
    2023-09-10
    java jvm servlet Powered by 金山文档
  • python防止栈溢出的实例讲解
    1、说明 使用递归函数的优点是逻辑简单清晰,缺点是过深的调用会导致栈溢出。 解决递归调用栈溢出的方法是通过尾递归优化,事实上尾递归和循环的效果是一样的,所以,把循环看成是一种特殊的尾递归函数也是可以的。 2、实例 ...
    99+
    2022-06-02
    python 栈溢出
  • 使用JVM怎么实现栈溢出和堆溢出
    本篇文章为大家展示了使用JVM怎么实现栈溢出和堆溢出,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、栈溢出StackOverflowError栈是线程私有的,生命周期与线程相同,每个方法在执行的时...
    99+
    2023-06-15
  • java栈溢出如何解决
    在Java中,出现栈溢出的情况通常是由于递归调用导致的。当递归调用的层数过多时,栈空间会耗尽,从而抛出StackOverflowEr...
    99+
    2023-10-10
    java
  • linux栈为什么会溢出
    这篇文章主要介绍了linux栈为什么会溢出的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇linux栈为什么会溢出文章都会有所收获,下面我们一起来看看吧。在linux中,栈溢出的原因是系统栈是由高地址往低地址增长...
    99+
    2023-06-30
  • java堆栈溢出如何解决
    Java堆栈溢出(StackOverflowError)是由于递归调用或者方法调用链过长导致的。以下是几种解决方法:1. 检查递归调...
    99+
    2023-09-21
    java
  • linux堆栈溢出如何解决
    要解决Linux堆栈溢出的问题,可以采取以下几个步骤:1. 检查代码中是否存在潜在的堆栈溢出漏洞。堆栈溢出通常是由于函数调用的嵌套深...
    99+
    2023-10-10
    linux
  • java递归栈溢出如何解决
    在Java中,递归栈溢出错误通常发生在递归调用过程中,导致栈空间不足以处理所有的递归调用。以下是解决递归栈溢出的几种方法:1. 优化...
    99+
    2023-08-31
    java
  • java常见的栈溢出有哪些
    在Java中,常见的栈溢出错误有以下几种:1. 递归调用造成的栈溢出:当一个方法递归调用自身次数过多,导致栈空间被耗尽,就会发生栈溢...
    99+
    2023-08-31
    java
  • 解决java.lang.StackOverflowError错误(栈溢出异常)
    原因 原因1:递归导致,死循环或者无限循环调用,多个实体类之间有多对一、多对多 关系时,重写toString方法的时候一定要注意,不要两个有对应关系的实体类都重写相关联属性字段的toString方法,...
    99+
    2023-09-01
    java 开发语言
  • eclipse提示堆栈溢出怎么解决
    当Eclipse提示堆栈溢出错误时,可以尝试以下几种方法解决:1. 增加堆栈大小:在Eclipse的启动配置文件(eclipse.i...
    99+
    2023-09-21
    eclipse
  • log4net堆栈溢出问题怎么解决
    Log4net的堆栈溢出问题可能是由于日志消息的递归输出或无限循环造成的。以下是一些可能的解决方案:1. 确保日志消息中没有无限循环...
    99+
    2023-09-16
    log4net
  • java堆栈溢出的原因有哪些
    Java堆栈溢出的主要原因包括:1. 递归调用:如果一个方法在执行过程中不断地调用自身,而没有终止条件或者终止条件不满足时,就会导致...
    99+
    2023-10-10
    java
  • Microsoft SQL Server 堆栈溢出漏洞加固
    Microsoft SQL Server 堆栈溢出漏洞官网https://technet.microsoft.com/zh-cn/library/security/ms14-085.aspx下载对应SQLS...
    99+
    2022-10-18
  • 递归出现栈溢出stackoverflow的问题及解决
    目录递归出现栈溢出stackoverflow递归调用中栈溢出原因递归出现栈溢出stackoverflow 递归是个不断回调方法的过程,使方法一遍遍的压入栈中,递归次数多了,栈满了也就...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作