六、递归(Recursion)

一、递归概述

应用:DSF深度优先搜索、前中后序二叉树遍历等

三个条件:

  1. 一个问题的解可以分解为几个子问题的解
  2. 该问题与分解之后的子问题,除了数据规模不同,求解思路完全一样
  3. 存在递归终止条件


写递归代码的关键:

  • 如何将大问题分解为小问题的规律 =》写出递归公式
  • 确定终止条件
  • 将递推公式 和 终止条件 转化为codes

优点:表达力强、非常简洁;
缺点:空间复杂度高、有堆栈溢出的风险、存在重复计算、过多的函数调用耗时等问题。

二、注意

1、警惕堆栈溢出

影响:堆栈溢出 ==》系统性崩溃

原因:系统栈或虚拟机栈空间一般都不大。若递归求解的数据规模很大,调用层次很深,一直压入栈,就会有堆栈溢出的风险。

措施:

  1. 设置递归调用的最大深度,也就是递归调用超过一定深度之后,就不继续再递归下去,而是直接返回报错。==》不是很实用
  2. 通过在堆上模拟实现一个函数调用栈,手动模拟压栈、出栈的过程,这样就没有系统栈大小的限制。

2、警惕重复计算

例如:斐波那契数。eg:1、1、2、3、5、8、
在这里插入图片描述
从图中可得==》f(3) 就被计算了很多次,这就是重复计算问题。

措施:

  1. 可以通过一个数据结构(例如散列表)来保存已经求解过的 f(k) 。当递归调用到 f(k) 时,先确定是否已经求解过了,若是则直接取数,否则再进行计算。

3、时间和空间复杂度

  • 时间:调用的数量较大时 ==》时间成本
  • 空间:每递归一次就会在内存栈中保存一个现场数据。

4、递归代码 =》非递归代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值