首先,递归调用是函数调用自己本身,在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。

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

但是,Python解释器没有做优化,即使把递归函数修改成尾递归的方式依然无法解决问题。

所以参考了这位老哥的代码
链接: Python尾递归优化.

import sysclass TailRecurseException(BaseException):def __init__(self, args, kwargs):self.args = argsself.kwargs = kwargsdef tail_call_optimized(g):"""This function decorates a function with tail calloptimization. It does this by throwing an exceptionif it is it's own grandparent, and catching suchexceptions to fake the tail call optimization.This function fails if the decoratedfunction recurses in a non-tail context."""def func(*args, **kwargs):f = sys._getframe()if f.f_back:if f.f_back.f_back:if f.f_back.f_back.f_code == f.f_code:passif f.f_back and f.f_back.f_back and f.f_back.f_back.f_code == f.f_code:# 抛出异常raise TailRecurseException(args, kwargs)else:while 1:try:return g(*args, **kwargs)except TailRecurseException as e:args = e.argskwargs = e.kwargsfunc.__doc__ = g.__doc__return func@tail_call_optimized
def demo_2(n, res=1):if n <= 1:return resreturn demo_2(n-1, n*res)print(demo_2(9999))

拓展:

栈帧(frame)
  栈帧表示程序运行时函数调用栈中的某一帧。想要获得某个函数相关的栈帧,则必须在调用这个函数且这个函数尚未返回时获取。可以使用sys模块的_getframe()函数、或inspect模块的currentframe()函数获取当前栈帧。这里列出来的属性全部是只读的。
f_back: 调用栈的前一帧。
f_code: 栈帧对应的code对象。
f_locals: 用在当前栈帧时与内建函数locals()相同,但你可以先获取其他帧然后使用这个属性获取那个帧的locals()。
f_globals: 用在当前栈帧时与内建函数globals()相同,但你可以先获取其他帧……
第二次调用时:
f.f_back.f_back.f_code和f.f_code为同一对对象调用

Python开启尾递归优化,解决Process finished with exit code -1073741571 (0xC00000FD)相关推荐

  1. 解决报错Process finished with exit code -1073741571 (0xC00000FD),修改栈大小

    运行程序时程序意外终止,并返回提示: Process finished with exit code -1073741571 (0xC00000FD) 导致的原因是StackOverflow(栈区溢出 ...

  2. python Process finished with exit code -1073741571 (0xC00000FD)

    注意:本文提供的三种方法仅供参考,未必一定能解决您的问题!如别无他法,可以一试. 跑程序时遇到这样的错误代码,Process finished with exit code -1073741571 ( ...

  3. Process finished with exit code -1073741571 (0xC00000FD)的解决方案

    Process finished with exit code -1073741571 (0xC00000FD) 用clion写归并排序的时候出现了这个代码,然而代码在oj上是可以运行得到正确结果的. ...

  4. 报错Process finished with exit code -1073741571 (0xC00000FD) 程序是否可以完成

    这个错误代码 -1073741571 (0xC00000FD) 表示程序运行时发生了栈溢出.栈溢出通常是由于程序递归调用次数太多导致的,或者因为程序分配了太多内存导致栈空间不足. 这个错误通常不能被程 ...

  5. python勾股定理、0-30_求助python大神,显示Process finished with exit code 0.

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 # Process Contours for c in contours: # Filter Contour By Size if len(humanSi ...

  6. 记解决pycharm报错 Process finished with exit code -1073741819 (0xC0000005)

    最近在做一个抢单项目: python项目莫名出现:Process finished with exit code -1073741819 (0xC0000005),程序没执行结束退出! . 网上找了好 ...

  7. python Process finished with exit code -1073741819 (0xC0000005) 解决

    运行程序时,Process finished with exit code -1073741819 (0xC0000005) 报错 原因:没有 python33.dll 在 c:\WINDOWS\sy ...

  8. python中关于Process finished with exit code -1073740791 (0xC0000409)的解决办法

    有些小伙伴在运行python程序的时候会遇到上图这种情况.对于这种情况不要着急,使用排除法很容易解决. 情况一(也是网上较多的情况):(显卡)内存不足 这个时候,我们可以在pycharm里调一下内存: ...

  9. 【已解决】程序异常终止:Process finished with exit code -1073741819 (0xC0000005)

    一.问题出现背景: 项目环境:Maven + IDEA + JDK1.8 使用Run执行程序时直接终止并出现上述提示信息Process finished with exit code -1073741 ...

最新文章

  1. 7 种常用的排序算法直观感受
  2. 2020 最新 JVM 生态报告
  3. Java自带的广告怎么删掉_如何屏蔽电脑上的弹窗广告?
  4. wpf 客户端【JDAgent桌面助手】开发详解(四) popup控件的win8.0的bug
  5. Linux虚拟内存映射分析以及CMA测试 - 以SSD202为例
  6. 每天一道LeetCode-----有序数组右移n位后查找某个元素
  7. TortoiseSVN无法查看日志和SVN LOG无法查看日志的解决办法。
  8. Flask/Django/Tornado语法对比(持续更新中)
  9. C语言——迭代法求a的平方根——更新01
  10. 【剑指Offer】18树的子结构
  11. 周华健,歌声伴我成长(五)
  12. 音频文件如何转换成文字?
  13. IL反汇编器(ILDASM)和IL汇编器(ILASM)Hello World小demo
  14. Consul 集群部署
  15. 关于Spring Bean的生命周期
  16. 电脑配件 - 机械键盘的由来, 与普通键盘的区别以及如何选购及使用维护 - 学习/实践
  17. 专家:大数据正成为促进经济转型新动能
  18. 噩梦射手(SurvivalShooter)教程(六)
  19. #define的用法
  20. 实现时间的计算: 要求用户输入身份证号,若格式有误,要求其重新输入。然后根据身份证号码输出20岁生日所在周的周三的日期

热门文章

  1. 苹果手机适配手写代码
  2. android用开源框架实现仿地图界面功能
  3. iOS字符串截取字符
  4. 使用 DML语句,对 “锦图网” 数据进行操作,聚合函数练习
  5. 【CompletableFuture模拟真实场景之性能优化】
  6. 完美“登录”,从去掉“注册”开始
  7. unturned组服务器网站,unturned创建服务器
  8. DAMA学习笔记4-7
  9. Color:颜色的几种常用表示方式
  10. QSortFilterProxyModel实现排序、过滤