概述
本人是一个小白,本文是自己在学习递归的过程中通过参考大神的文章并结合自己的一些见解完成的,过程中可能有某些地方有所偏差, 请各位批评指正…
一、什么是递归
所谓递归,简单来说就是自己调用自己,当满足某个条件时停止调用。递归体现的是一种解决问题思路、解决问题的一个过程,递归由递归头和递归体两部分组成:
1.递归头:什么时候不调用自身方法。如果没有头将陷入死循环
2.递归体:什么时候调用自身方法。
当然,由于递归体现的是一种解决相关问题的过程,我们还可以这样理解:递归就是“递过去,归回来”,是产生栈帧并压栈进入方法栈,然后运行的过程。
下面我们通过一个实际案例再来解释一下:
我们去电影院看电影,找座位是一个比较麻烦的过程,这时你不想一排一排的数,就直接问了前一排的 人:你是第几排。这样前排的人就回去回答你,这样你就知道了当前是第几排。如果前排的人也不想数而是向前一排人问,同时这个人再先前问,一直递归下去直到第一排或者有人明确自己是第几排(假设是K)后,最后按照K+1的方式“归回去”就能知道所有人的位置了。
递归的过程有点像for,有循环条件和循环体,递归当中必须要有递归头来控制什么时候递归结束。
二、递归特点
递归就是方法里调用自身
在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口
递归算法代码显得很简洁,但递归算法解题的运行效率较低。所以一般情况下不建议使用递归。
在递归调用的过程中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。
三、递归经典案例和过程分析
案例一、使用递归方式打印九九乘法表
在学习java基础的for循环的过程中我们一般都会使用for循环的嵌套来实现一个下三角形的九九乘法表,直接一个for循环嵌套即可实现,那么下面我们将使用递归的方式重新实现一下:
public static void main(String[] args) {
methodTest(9);
}
/*
* @Author LY
* @Description 递归方式实现九九乘法表
* @Date 22:21 2020/8/13
**/
private static void methodTest(int i) {
if (i == 1) { //递归头:控制什么时候结束调用自己
System.out.println("1*1=1 ");
} else { //递归体:什么时候调用自己
methodTest(i - 1);
for (int j = 1; j <= i; j++) {
System.out.print(j + "*" + i + "=" + j * i + "t");
}
System.out.println();
}
}
下面通过调试来简单看一下执行的过程:
在上面这一阶段中一直在执行“递过去”,for循环还没有执行。我们接着向下调试:
当递归条件不满足时(i==1时),“递过去”的过程结束,开始“归回去”的过程,即开始执行for循环。
(图片来源于网络)
其实在上面每执行一次“递过去”即每一个方法的调用都会产生一个栈帧,并将栈帧压到方法栈当中,然后在完成“归回去”的时候按照“先进后出”的顺序依次执行相应方法(参数会发生变化)。
在使用递归的方式实现九九乘法表的时候,每执行一次方法的过程就会发生一次压栈操作,这样的话就会比较占用内存,而使用for循环嵌套的话,由于只执行了一次方法因此比较节省内存。
案例二、
public static void main(String []args){
printN(1);
}
private static void printN(int i) {
System.out.println("1-lexe:" + i);
if (i < 3) {
printN(i + 1);
}
System.out.println("2-lexe:" + i);
}
递归执行过程基本和上面的执行类似,都是要多次执行printN方法。
简单用语言描述一下执行:
- main方法中开始调用printN()方法并将i= 1传递给方法。
- 进入printN方法内部并输出: 1-lexe:1
- 由于i(i=1)❤️,printN(i+1)被调用,此时i变成2,输出1-lexe:2(这个过程中也会发生一个简单的压栈的过程);
- 由于i(i=2)❤️,printN(i+1)被调用,此时i变成3,输出1-lexe:3;
- 由于i(i=3)<3不成立,递归结束,完成“递过去”,开始执行"归回去"即压栈到方法栈中的printN方法(按照先进后出的方式执行)。输出2-lexe:3;
- 输出2-lexe:2;
- 输出2-lexe:1(“归回去”的过程可以看成i从3递减到1的过程)
上面就是一个简单的执行过程。
文章参考:
https://blog.csdn.net/ethan_10/article/details/80737879
https://www.cnblogs.com/renxiaoren/p/4568745.html
https://www.cnblogs.com/klqmg/p/6260486.html
最后
以上就是俊秀手机为你收集整理的java中对递归的简单理解的全部内容,希望文章能够帮你解决java中对递归的简单理解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复