一.什么是递归?

递归,就是在运行的过程中不断地调用自己。递归有两个过程,简单的说一个是递的过程,一个是归的过程。简单用代码来理解:

public void fun(参数) {if (终止条件) {return;}fun(参数);(其他判断条件或语句);
}

在上边代码中,当第一次进入函数时,先判断是否符合终止条件,符合则直接结束函数,不符合入下一语句,调用自己重新进入下一层自身函数,(注意这是最外一层将不向下继续执行语句,外层卡在fun(参数处)),这个调用自己进入自身函数的操作过程即为“递”的过程。假设进入下一层后符合终止条件,返回结果,此时之前进入自身函数执行完成返回最外一层函数,最外一层函数递归调用处得到结果,(即内层函数执行完成得到结果返回值),这个过程即为“归”的过程。这时最外一层函数才能继续执行下一语句,直至函数运行完成。


二.判断递归使用的场景

1.大问题可以拆分为多个子问题。

2.原问题和拆分后的子问题除了数据规模不同,解决思路完全相同。

3.存在递归终止条件。

递归在线性数据结构中使用不太明显,迭代基本可以很容易的解决问题。

递归在非线性结构中非常重要,比如二叉树,回溯,典型的树形问题-九宫格字母组合

三.递归代码的写法,(一定要注意方法的语义)

递归必须具备两个条件,

一是有边界,即终止条件。

二是需要调用自己。

这两个条件缺一不可,并且其中终止条件语句必须在递归调用语句之前。如果顺序颠倒则递归函数会进入死循环,永远退不出来,会出现堆栈溢出异常(StackOverflowError)。

在递归函数中,终止条件可以不只一个,递归调用也可以通过一些逻辑语句分成好几个。


三.讲一个简单且经典的实例(我认为的)

青蛙跳台阶问题:一只青蛙要跳上n层高的台阶,一次能跳一阶,也可以跳2阶,请问这只青蛙跳上n层高的台阶有多少种跳法?

问题解决:这个问题有好几种解法,这里就讲递归方法,这个问题需要逆向思维,如果从第一个台阶就开始算,就比较难想到终止条件,以及递归调用方式。我们可以让青蛙下台阶,一次可以下一个,也可以下两个。这时我们可以知道:

当n=1时,只有一种方法。

当n=2时,有两种方法。

其n>2时,青蛙可以选择跳两层台阶,也可以选择跳一层台阶。

以上我们可以得到,终止条件为台阶剩下1或2层时可以直接得到结果,即为边界。当n>2时我们可以使用递归语句调用自身。这样就可以写出递归代码:

public int climbStairs(int n){//终止条件if(n == 1)return 1;if(n == 2)return 2;//递归调用,此时青蛙可以选则跳一阶也可以跳两阶,所以将两种情况相加起来return climbStairs(n-1) + climbStairs(n-2);
}

什么是递归?递归的理解相关推荐

  1. 图的dfs非递归_如何理解恶心的递归

    力扣​leetcode-cn.com 递归恶心主要恶心在无论是做题还是解析都比较抽象,这里记录一下递归小白的理解过程: # Definition for a binary tree node. 以上图 ...

  2. 递归 递归的案例 递归的案例

    递归 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8&q ...

  3. python 递归-递归可视化

    python 递归-递归可视化 文章目录 python 递归-递归可视化 1.实现 a. 螺旋线 b. 分形树 c. 谢尔平斯基三角 2.递归可视化-Coding 1.实现 a. 螺旋线 指定原始单边 ...

  4. java 递归思想的理解

    递归 递归方法是调用自身的方法 看一个阶乘的demo public class Main {/*** 5*4*3*2*1* @param n* @return*/public static int M ...

  5. 对于C语言函数递归的简单理解(新手入门必看!!!)

    什么是函数递归? 程序调用自身的编程技巧称为递归(recursion). 递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接 调用自身的 一种方法,它通常把一个大型 ...

  6. java 链表反转 递归_递归法的理解——以反转链表为例

    2020-01-07 递归是什么: 递归,从定义上说,指的是某个函数直接或者间接调用自己时,则发生了递归. 比如说著名的斐波拉契数列的实现方法之一: 1 public static int f(int ...

  7. 汉诺塔递归问题的理解

     对递归的理解的要点主要在于放弃! 放弃你对于理解和跟踪递归全程的企图,只理解递归两层之间的交接,以及递归终结的条件. 想象你来到某个热带丛林,意外发现了十层之高的汉诺塔​.正当你苦苦思索如何搬动它时 ...

  8. 递归怎么理解 php,求php一段递归代码的理解

    这样吧,我们假设让$count小于2时来看看整个执行过程: 将小于10改为小于2: function test() { static $count = 0; $count++; echo " ...

  9. python的递归为什么难理解_为什么Python有最大的递归深度?

    实际上这里有几个问题.在 首先,正如NPE's answer很好地解释的那样,Python并没有消除尾部调用,所以在Python中允许无限递归的函数(比如Scheme)是有限的.在 其次,正如NPE所 ...

  10. 用类比方式学习编程中函数递归(个人理解仅供参考)(内含汉诺塔问题的求解)

    目录 1.前言 2.递归的数学模型 3.相关的c语法 4.将递归的数学模型写成编程语言 5.利用类比方法将实际问题的代码写成函数递归的形式 例1: 例2: 6.汉诺塔问题的求解 1.前言 本人在学习函 ...

最新文章

  1. java 证件识别_证件识别接口JAVA调用示例
  2. linux 如何查看tomcat实时的日志
  3. 【云计算】阿里云云计算专业认证考试
  4. 转:a标签中如果有button, 那么在IE下就不能跳转到herf的链接
  5. windows下gdb的下载和安装使用初步
  6. fastjson jar包_经过性能对比,我发现温少的FastJson真牛。
  7. android面试详解
  8. 转 c#读写xml文件
  9. 一名“企业定制化人才”的自诉:“我不愿意,但却无可奈何”
  10. 算法设计与分析——回溯法——批处理作业调度
  11. 老板必须亲自抓销售,公司越小越如此
  12. 386 · Longest Substring with At Most K Distinct Characters最多有k个不同字符的最长子字符串
  13. 蓝桥杯每日真题之货物摆放
  14. 【每日算法Day 72】谷歌面试题:又双叒叕是位运算,最详细的自动机推导过程...
  15. 五分钟搭建 Flash 视频直播站
  16. 64. magento enable error report
  17. Cannot complete this action,please try again. Correlation ID :bd640a9d-4c19-doff-2fe0-6ce1104b59ae
  18. 【2022】字节跳动面试真题,1000问(Java岗)
  19. 想了解3D结构光,看这份拆解就对了
  20. 解决使用Glide加载图片背景出现浅绿色

热门文章

  1. 第四章——波形与矢量AWGN信道
  2. 百度年龄计算机在线使用,百度年龄计算器app
  3. 加州靡情第一至七季/全集Californication迅雷下载
  4. TI公司电话面试 ---- 问题回忆录 2012年8月20
  5. 关于PX像素、PT点数、CM厘米、MM毫米之间的换算
  6. 记一次超好用下载器you-get复活
  7. 谷歌开发者大会召开 地图服务成亮点
  8. H5 实现类似QQ消息列表(已读,未读)拖拽点击事件功能
  9. android硬编码h264数据,并使用rtp推送数据流,实现一个简单的直播-MediaCodec(二)
  10. 如何将div拼接成html代码,给div拼接html 拼接字符串