转载于

https://www.jiuzhang.com/tutorial/algorithm/444

什么是递归深度

递归深度就是递归函数在内存中,同时存在的最大次数
例如下面这段求阶乘的代码:

int factorial(int n) {if (n == 1) {return 1;}return factorial(n - 1) * n;
}

n=100时,递归深度就是100。一般来说,我们更关心递归深度的数量级,在该阶乘函数中递归深度是O(n)O(n),而在二分查找中,递归深度是O(log(n))O(log(n))。在后面的教程中,我们还会学到基于递归的快速排序、归并排序、以及平衡二叉树的遍历,这些的递归深度都是(O(log(n))(O(log(n))。注意,此处说的是递归深度,而并非时间复杂度。

太深的递归会内存溢出

首先,函数本身也是在内存中占空间的,主要用于存储传递的参数,以及调用代码的返回地址。
函数的调用,会在内存的栈空间中开辟新空间,来存放子函数。递归函数更是会不断占用栈空间,例如该阶乘函数,展开到最后n=1时,内存中会存在factorial(100), factorial(99), factorial(98) ... factorial(1)这些函数,它们从栈底向栈顶方向不断扩展。
当递归过深时,栈空间会被耗尽,这时就无法开辟新的函数,会报出stack overflow这样的错误。
所以,在考虑空间复杂度时,递归函数的深度也是要考虑进去的

Follow up:
尾递归:若递归函数中,递归调用是整个函数体中最后的语句,且它的返回值不属于表达式的一部分时,这个递归调用就是尾递归。(上例factorial函数满足前者,但不满足后者,故不是尾递归函数)
尾递归函数的特点是:在递归展开后该函数不再做任何操作,这意味着该函数可以不等子函数执行完,自己直接销毁,这样就不再占用内存。一个递归深度O(n)O(n)的尾递归函数,可以做到只占用O(1)O(1)空间。这极大的优化了栈空间的利用。
但要注意,这种内存优化是由编译器决定是否要采取的,不过大多数现代的编译器会利用这种特点自动生成优化的代码。在实际工作当中,尽量写尾递归函数,是很好的习惯。
而在算法题当中,计算空间复杂度时,建议还是老老实实地算空间复杂度了,尾递归这种优化提一下也是可以,但别太在意。

认识你是我们的缘分,同学,等等,记得关注我。

微信扫一扫
关注该公众号

什么是 Stack Overflow,什么情况下会造成 Stack Overflow相关推荐

  1. ELK Stack在多项目情况下filebeat与logstash的多文件配置

    ELK Stack环境的相关搭建可以参考我的上一篇文章 这里配置中涉及到的域名在对应机器上要配置host,kafka的host 假设这里有两个项目:insurance项目,app项目 insuranc ...

  2. java中如何把时间封装成类,java-如何在不使用任何不推荐使用的类的情况下将日期从一种格式转换为另一种格式的日期对象?...

    java-如何在不使用任何不推荐使用的类的情况下将日期从一种格式转换为另一种格式的日期对象? 我想将date1格式的日期转换为date2格式的日期对象. SimpleDateFormat simple ...

  3. Java不用main方法运行_如何在不定义main方法的情况下运行Java程序?

    我正在查看一些Java源代码,并注意到main方法没有定义. Java如何编译源代码而不知道从哪里开始? main方法仅在Java虚拟机执行代码时使用.没有main方法就无法执行代码,但仍然可以编译代 ...

  4. @应届生,如何在没有实际项目经验的情况下找到工作

    本文转载自CSDN公众号 作者丨Paddy Sherry 翻译丨LeviDing 许多开发人员在找工作的时候,虽然满足了对方所要求的理论技能,但是缺乏实际的开发经验,这让雇主在是否雇用你这个问题上犹豫 ...

  5. 进一步封装axios并调用其读取数据(吐槽~在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据)

    注意!!!(修改于2020年7月18日) 在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据 报错截图如下 报错内容: {&quo ...

  6. 如何在不停止程序的情况下打印完整的回溯?

    我正在编写一个程序,该程序可以解析10个网站,找到数据文件,保存文件,然后解析它们以生成可以在NumPy库中轻松使用的数据. 有过不良链接,不好的XML,缺项,其他的事情我还没有进行分类文件遭遇吨的错 ...

  7. undo表空间文件丢失恢复(3)--无备份无redo的情况下恢复

    undo表空间的数据文件丢失,如果没有备份的情况下,而且redo也不可用,这个时候就要采用隐藏参数来恢复,下边给出一个例子. undo表空间文件丢失恢复(1)--有备份的情况下恢复:http://bl ...

  8. [js] 举例说明Object.defineProperty会在什么情况下造成循环引用导致栈溢出?

    [js] 举例说明Object.defineProperty会在什么情况下造成循环引用导致栈溢出? var data = {count: 1,value: 2 } Object.definePrope ...

  9. 替换jar包_替换代码的情况下不停机!这操作可能工作6年的Java程序员都不会

    相信很多人都有这样一种感受,自己写的代码在开发.测试环境跑的稳得一笔,可一到线上就抽风,不是缺这个就是少那个反正就是一顿报错,而线上调试代码又很麻烦,让人头疼得很.不过, 阿里巴巴出了一款名叫Arth ...

最新文章

  1. PHP手机号中间四位用星号*代替显示
  2. Linux centos 6.7设置MySQL为开机启动
  3. 面试ASP.NET程序员的笔试题和机试题
  4. NET问答: 有最干净利落的读写文件方式吗?
  5. Koa框架——coderhub实战
  6. python request处理_python requests异常处理
  7. 工业品器械设备怎么做宣传和推广?
  8. redis的持久化(RDBAOF的区别)
  9. STM32 USB DFU功能
  10. 图像处理之Lanczos采样放缩算法
  11. 华为云 IoT 物联网数据分析能力详解
  12. u盘提示格式化怎么修复?80%的人都在这么做!
  13. Hive 常用日期处理-昨天、本月、上月同期、去年同期、月初、月末等
  14. php输出扶墙而立的三角形,第10章 天天扶墙而立
  15. 条码软件如何调整条形码的密度
  16. 2021年中国工业软件行业发展现状及未来发展趋势分析:工业软件进入快速发展期[图]
  17. everpano 3D立体漫游软件
  18. 大顶堆,小顶堆——排序问题
  19. 【恶意代码与软件安全分析】(一)PE——可执行文件
  20. 个人理财第十一课-百万富翁秘诀-----基金定投

热门文章

  1. Java并发编程:synchronized
  2. kafka与Spring的集成
  3. 【OO学习】OO第二单元作业总结
  4. vue环境搭建以及vue-cli使用
  5. Hadoop 2.x简介
  6. Cannot return from outside a function or method.
  7. 算法笔记_036:预排序(Java)
  8. Xcode7.0.1:升级Xcode7上传AppStore失败问题
  9. 使用PyQt4和twisted写的局域网聊天室(2)
  10. 用jsp开发web应用并不是一个高效率的选择