什么是递归?递归的理解
一.什么是递归?
递归,就是在运行的过程中不断地调用自己。递归有两个过程,简单的说一个是递的过程,一个是归的过程。简单用代码来理解:
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);
}
什么是递归?递归的理解相关推荐
- 图的dfs非递归_如何理解恶心的递归
力扣leetcode-cn.com 递归恶心主要恶心在无论是做题还是解析都比较抽象,这里记录一下递归小白的理解过程: # Definition for a binary tree node. 以上图 ...
- 递归 递归的案例 递归的案例
递归 <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8&q ...
- python 递归-递归可视化
python 递归-递归可视化 文章目录 python 递归-递归可视化 1.实现 a. 螺旋线 b. 分形树 c. 谢尔平斯基三角 2.递归可视化-Coding 1.实现 a. 螺旋线 指定原始单边 ...
- java 递归思想的理解
递归 递归方法是调用自身的方法 看一个阶乘的demo public class Main {/*** 5*4*3*2*1* @param n* @return*/public static int M ...
- 对于C语言函数递归的简单理解(新手入门必看!!!)
什么是函数递归? 程序调用自身的编程技巧称为递归(recursion). 递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接 调用自身的 一种方法,它通常把一个大型 ...
- java 链表反转 递归_递归法的理解——以反转链表为例
2020-01-07 递归是什么: 递归,从定义上说,指的是某个函数直接或者间接调用自己时,则发生了递归. 比如说著名的斐波拉契数列的实现方法之一: 1 public static int f(int ...
- 汉诺塔递归问题的理解
对递归的理解的要点主要在于放弃! 放弃你对于理解和跟踪递归全程的企图,只理解递归两层之间的交接,以及递归终结的条件. 想象你来到某个热带丛林,意外发现了十层之高的汉诺塔.正当你苦苦思索如何搬动它时 ...
- 递归怎么理解 php,求php一段递归代码的理解
这样吧,我们假设让$count小于2时来看看整个执行过程: 将小于10改为小于2: function test() { static $count = 0; $count++; echo " ...
- python的递归为什么难理解_为什么Python有最大的递归深度?
实际上这里有几个问题.在 首先,正如NPE's answer很好地解释的那样,Python并没有消除尾部调用,所以在Python中允许无限递归的函数(比如Scheme)是有限的.在 其次,正如NPE所 ...
- 用类比方式学习编程中函数递归(个人理解仅供参考)(内含汉诺塔问题的求解)
目录 1.前言 2.递归的数学模型 3.相关的c语法 4.将递归的数学模型写成编程语言 5.利用类比方法将实际问题的代码写成函数递归的形式 例1: 例2: 6.汉诺塔问题的求解 1.前言 本人在学习函 ...
最新文章
- java 证件识别_证件识别接口JAVA调用示例
- linux 如何查看tomcat实时的日志
- 【云计算】阿里云云计算专业认证考试
- 转:a标签中如果有button, 那么在IE下就不能跳转到herf的链接
- windows下gdb的下载和安装使用初步
- fastjson jar包_经过性能对比,我发现温少的FastJson真牛。
- android面试详解
- 转 c#读写xml文件
- 一名“企业定制化人才”的自诉:“我不愿意,但却无可奈何”
- 算法设计与分析——回溯法——批处理作业调度
- 老板必须亲自抓销售,公司越小越如此
- 386 · Longest Substring with At Most K Distinct Characters最多有k个不同字符的最长子字符串
- 蓝桥杯每日真题之货物摆放
- 【每日算法Day 72】谷歌面试题:又双叒叕是位运算,最详细的自动机推导过程...
- 五分钟搭建 Flash 视频直播站
- 64. magento enable error report
- Cannot complete this action,please try again. Correlation ID :bd640a9d-4c19-doff-2fe0-6ce1104b59ae
- 【2022】字节跳动面试真题,1000问(Java岗)
- 想了解3D结构光,看这份拆解就对了
- 解决使用Glide加载图片背景出现浅绿色
热门文章
- 第四章——波形与矢量AWGN信道
- 百度年龄计算机在线使用,百度年龄计算器app
- 加州靡情第一至七季/全集Californication迅雷下载
- TI公司电话面试 ---- 问题回忆录 2012年8月20
- 关于PX像素、PT点数、CM厘米、MM毫米之间的换算
- 记一次超好用下载器you-get复活
- 谷歌开发者大会召开 地图服务成亮点
- H5 实现类似QQ消息列表(已读,未读)拖拽点击事件功能
- android硬编码h264数据,并使用rtp推送数据流,实现一个简单的直播-MediaCodec(二)
- 如何将div拼接成html代码,给div拼接html 拼接字符串