递归是一种应用非常广泛的算法(或者编程技巧)。递归求解问题的分解过程,去的过程叫“递”,回来的过程叫“归”。

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

问题:N级台阶(比如100级),每次可走1步或者2步,求总共有多少种走法?

分析:如果有大于2级的n级台阶,那么假如第一次跳一级台阶,剩下还有n-1级台阶,有f(n-1)种跳法,假如第一次条2级台阶,剩下n-2级台阶,有f(n-2)种跳法。这就表示f(n)=f(n-1)+f(n-2),即斐波那契数列。假设只有一个台阶,那么只有一种跳法,那就是一次跳一级,f(1)=1;如果有两个台阶,那么有两种跳法,第一种跳法是一次跳一级,第二种跳法是一次跳两级,f(2)=2。

编写递归代码的关键是,只要遇到递归,我们就把它抽象成一个递推公式,不用想一层层的调用关系,不要试图用人脑去分解递归的每个步骤。

递归代码要警惕重复计算

为了避免重复计算,我们可以通过一个数据结构(比如散列表)来保存已经求解过的 f(k)。

递归代码要警惕堆栈溢出

我们可以通过在代码中限制递归调用的最大深度的方式来解决这个问题,递归调用超过一定深度(比如 1000)之后,我们就不继续往下再递归了,直接抛出异常。

怎么将递归代码改写为非递归代码?

递归本身就是借助栈来实现的,如果我们自己在内存堆上实现栈,手动模拟入栈、出栈过程,便可以将递归改成非递归。

递归Java_递归的Java实现相关推荐

  1. 二叉树 递归 java_递归实现二叉树 JAVA

    今天顶着要交年终文档的压力,总算理清了递归方式实现二叉树的方法,彻底弄明白要如何建一颗二叉树了!终于了切了一桩心愿!苦苦思索近两个星期了,郁闷得快不行了.终于一见庐山真面目,真是凡事一定要坚持到底呀! ...

  2. 递归下降分析器的设计java_数据结构(Java版)教与学(48和60学时教学大纲)

    baba<数据结构>课程教学大纲课程中文名称: 数据结构.课程英文名称:Data Structures.课程类别:专业基础课 必修.课程学分数:4(16学时为1学分)课程学时数:讲课48学 ...

  3. java 建树源码_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...

    import java.util.ArrayDeque; import java.util.Queue; import java.util.Stack; //二叉树的建树,前中后 递归非递归遍历 层序 ...

  4. 非递归遍历N-ary树Java实现

    2019-03-25 14:10:51 非递归遍历二叉树的Java版本实现之前已经进行了总结,这次做的是非递归遍历多叉树的Java版本实现. 在非递归遍历二叉树的问题中我个人比较推荐的是使用双whil ...

  5. 黑马毕向东Java课程笔记(day20-1——20-17)IO流:File类及相关方法、递归、递归的相关练习、Properties、PrintWriter类与PrintStream类、合并流与切割流

    1.File类概述   File是文件和目录路径名的抽象表示形式. 用来将文件或者文件夹封装成对象,方便对文件与文件夹的属性信息进行操作.   前面说到的"流",它只能操作数据,想 ...

  6. Java 二叉树后序遍历(递归/非递归)

    Java 二叉树后序遍历(递归/非递归) 简介: 遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次. 设L.D.R分 ...

  7. 3. ackerman函数的递归实现算法用java语言_ackerman递归

    定义: n+1        n=0 A(m,n)={A(m-1,1) m=0 A(m-1,A(m,n-1)) n>0,m>0 #include #include using namesp ...

  8. java建树_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...

    本文实例讲述了Java实现的二叉树常用操作.分享给大家供大家参考,具体如下: import java.util.ArrayDeque; import java.util.Queue; import j ...

  9. Java 二叉树中序遍历(递归/非递归)

    Java 二叉树中序遍历(递归/非递归) 中序遍历 代码实现 递归方式 非递归方式 简介: 遍历是对树的一种最基本的运算,所谓遍历二叉树,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访 ...

最新文章

  1. prefetch 和preload_前端preload, prefetch,dns-prefetch,defer,async了解一下
  2. 如何使‘CREATE TABLE AS SELECT’能支持ORDER BY ?
  3. 各种Web漏洞测试平台
  4. 【转】C# 中Linq查询所有上级节点或所有下级节点
  5. python中的del,remove,pop有什么区别
  6. Frida基础操作命令
  7. 使用AspectJ,Javassist和Java Proxy进行代码注入的实用介绍
  8. 如何在Redhat 7 Linux系统上停止/启动和禁用/启用防火墙
  9. 国产数据库发展十策(二):数据库难在研发还是难在生态?
  10. SpringCloud概念理解
  11. 【BZOJ】【3671】【NOI2014】随机数生成器
  12. 华为hg255d+Openwrt锐捷认证在某农业公园
  13. 2022年小游戏----游戏背包系统之搭建背包UI
  14. 【bzoj 3864】Hero meets devil - DP套DP
  15. xcel Home 数据透视表初级班(10118班)小结第二课时
  16. 打造零售数据中台 数澜助百果园数字化转型
  17. python剔除st股_通达信剔除st的指标,通达信条件预警中如何剔除st股票
  18. 深度搜索迷宫问题(C语言实现)
  19. 在JS中如何获取时间以及转换时间
  20. python处理wps表格数据匹配_两个excel表格数据匹配wps-WPS怎样用VLOOKUP引用另一个表格的数据...

热门文章

  1. kingbase自带的驱动在哪_德国制造到底强在哪?从工博会上伺服驱动的创新上能看出真相!...
  2. python2中文字符串遍历乱码_完美解决Python2操作中文名文件乱码的问题
  3. r语言清除变量_如何优雅地计算多变量 | R语言进阶
  4. tp5 php正则邮箱,TP5验证器使用实例
  5. linux内核打印前有buildroot,buildroot-linux内核
  6. java 并列排名,178. 分数排名
  7. cc2530i2c可同时接受两个传感器的数据吗_汽车方向及维修_玉树沃尔沃S40方向机,宝马531电子方向机进水可以维修吗...
  8. UE4 左右立体参数
  9. git 代码回滚_能提交到远程的Git回滚
  10. 【转】刨根究底CSS(1):开篇