2019独角兽企业重金招聘Python工程师标准>>>

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

尾递归是指,在函数返回的时候,调用自身本身,并且,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 productreturn fact_iter(num - 1, num * product)

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

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

转载于:https://my.oschina.net/u/3055388/blog/862651

python 递归调用相关推荐

  1. Python递归调用

    递归调用:在调用一个函数过程中,直接或间接又调用该函数本身,称之为递归调用 递归必备的2个阶段  1递推 2回溯 当递推结束后就可以进行回溯了 Python默认设置递归层数为1000 递归示例: de ...

  2. python递归调用详解_Python递归调用自己的函数

    原博文 2019-11-16 10:36 − def fact(x): if x == 1: return 1 else: return x * fact(x-1) ... 0 191 相关推荐 20 ...

  3. python棋盘放麦粒求和递归_Python递归调用实现数字累加的代码

    我就废话不多说了,直接上代码吧! def sum_numbers(num): # 1.出口 if num == 1: return 1 # 2.数组累加 temp = sum_numbers(num ...

  4. Python函数的递归调用

    一:递归的定义 函数的递归调用:是函数嵌套调用的一种特殊形式 具体是指: 在调用一个函数的过程中又直接或者间接地调用到本身 # 直接调用本身 def f1():print('是我是我还是我')f1() ...

  5. python入门day16——函数的递归调用、二分法、三元表达式、匿名函数

    文章目录 函数的递归调用 递归调用应该分为两个阶段 二分法 三元表达式 匿名函数 函数的递归调用 函数的递归调用:就是在调用一个函数的过程中又直接或间接地调用自己 示例1:直接调用自己 def foo ...

  6. python递归解压文件_递归调用解压zip包或rar包

    不知道有没有小伙伴跟我一样犯这样的懒,一些简单重复的工作,总是嫌麻烦,懒得一步步去做,还每次都重复一样的操作.比如解压zip或rar的包,也许你会说,不就解压嘛,有啥的.问题来了,如果只是一个简单的压 ...

  7. python递归解压文件_Python之路10-递归调用解压zip包或rar包

    不知道有没有小伙伴跟我一样犯这样的懒,一些简单重复的工作,总是嫌麻烦,懒得一步步去做,还每次都重复一样的操作.比如解压zip或rar的包,也许你会说,不就解压嘛,有啥的.问题来了,如果只是一个简单的压 ...

  8. python 3 递归调用与二分法

    递归调用与二分法 1.递归调用 递归调用:在调用一个函数的过程中,直接或间接地调用了函数本身. 示例: def age(n):if n == 1:return 18 # 结束条件return age( ...

  9. python学习-综合练习四(最大公约数、最小公倍数、生成日历、递归调用、字符串)

    文章目录 最大公约数 最小公倍数 生成日历 递归调用 字符串 说明:本篇博文的知识点大部分来自 Python3 实例 最大公约数 求最大公约数的逻辑比较简单,这里直接上代码: def maxCommD ...

最新文章

  1. Kubernetes 集群使用 Jenkins 持续发布
  2. alert(1) to win 16
  3. Win2K下关联进程/端口之代码初步分析
  4. js引用action层变量
  5. php在数据流(内存)中操纵远程数据
  6. atcoder 2643 切比雪夫最小生成树
  7. 最多分成多少块(51Nod-2502)
  8. QEMU多进程(Multi-process QEMU)及vfio-user应用
  9. vapor mysql_vapor MySQL 作为Cache
  10. 第二章--物理层--重点
  11. 如何用视频转换器把qlv格式转换mp4
  12. 教你如何购买阿里云香港服务器(教程)
  13. [bowen干货]-redis常用五种数据类型命令和场景描述
  14. OAuth2授权原理
  15. Kubernetes之ServiceAccount+Secret(超详细汇总)
  16. @ConfigurationProperties(prefix = )异常报错解决方案:
  17. 情人节的自娱自乐——情书事件
  18. 【狂神说Java】视频笔记
  19. GUI(Graphical User Interface)
  20. 虚拟机构建局域网用户和组远程

热门文章

  1. android ajax 跨域更新本地html,本地webapp是怎么解决跨域问题的?
  2. C 线程中容易忽视的 restrict 修饰符修饰
  3. ios与html数据交互,iOS iOS与html进行交互
  4. 计算机程序输入x是3求输出七年级的题,七年级上册数学第三单元练习题
  5. android unity 关闭应用_在后台运行的Android Unity应用程序
  6. 如何在自己开发的日程管理页面插入提醒功能_微信中6个藏得很深但却很有用的功能...
  7. Verilog初级教程(23)Verilog仿真中的显示任务
  8. FPGA配置模式(Altera版)
  9. 纯CSS3实现GIF图片动画效果
  10. crontab定时任务详解