对于初学者或一些刚进入程序开发岗位的人可能对于递归的原理和递归底层调用原理还是不理解,接下来,我就为大家详细讲解一下递归。
1.什么是递归?
所谓递归,简单点来说,就是一个函数直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。
我们可以把” 递归 “比喻成 “查字典 “,当你查一个词,发现这个词的解释中某个词仍然不懂,于是你开始查这第二个词。
可惜,第二个词里仍然有不懂的词,于是查第三个词,这样查下去,直到有一个词的解释是你完全能看懂的,那么递归走到了尽头,然后你开始后退,逐个明白之前查过的每一个词,最终,你明白了最开始那个词的意思。(摘自知乎的一个回答)
这里注意加粗字体,递归一定是自己调用自己的方法,直到符合终止条件后,一一输出。
2.接下来我就举个例子来具体说明一下
public class digui {
public static void main(String[] args) {
Test t1 = new Test();
t1.test(4); <—(1)
}
static class Test{
public void test(int n){
if (n>2){ <—(2)
test(n-1); <—(3)
}
System.out.println("n="+n); <—(4)
}
}
}
首先代码很简单,看一下代码,我们首先在main方法里给test();方法传一个参数,此时n=4,进入if条件判断,显然 4 > 2,条件成立,然后再第(3)步中(代码里的<–(3)),又重新调用了test();方法,此时就进行了第一次的递归,然后n=3,继续进行步骤(2)和(3),知道当n=2时,条件不符合,就会执行步骤(4),此时输出的n的值应该分别有 :4, 3,2,三个值,但是递归是一个压栈的操作,**实际输出应该是:2 , 3,4。**这时候长得帅的小伙伴会问为什么呢?
3.什么是压栈
什么是压栈,举个例子,就比如羽毛球筒,大家想往羽毛球筒里放羽毛球,是不是第一个放的最后一个才能拿出来呀,这个压栈跟从羽毛球里拿羽毛球一个道理的,我画个图
此时我们的递归调用就像这个羽毛球筒一样(图画的不太好看QAQ将就看吧!),这个过程就叫压栈,这也就说明了什么是递归中,举的查字典的例子。
4.内存图解释
下面我们用内存图的方式解释一下这个递归调用程序的实现。一下引用了b站韩老师的图。
首先我们的程序中,在main方法里传了一个参数给test方法的n,当t1.test(4)调用test方法时,在内存中就系统就自动建了一个test栈(紫色那个),然后继续执行if语句,当递归调用自己的
test(n-1);方法时,又自动建了一个栈(黄色那个),用黑色箭头表示。以此类推,当n=2使,不满足递归的的条件时,自动退出递归。这时,就开始进行了我画的那个羽毛球筒的例子。
此时,当不满足继续递归时,开始向下执行,输出n的值,此时在内存栈中输出的顺序就是蓝色箭头画的那个样,从离终止条件最近的栈开始输出,**类似羽毛球筒那个,⑤号羽毛球最先进入球筒,但是却最后出来。**因此当递归结束时,输出的结果应该是 :2 , 3,4,并不是:4 , 3,2。另外,每当一个栈将结果输出后,栈就会在内存中自动清除。
好了,关于递归的调用和原理我想我写的已经很清楚了,大家认真学习这块的内容,挺重要的。喜欢的话欢迎点赞收藏。感谢!!! 0.0 :)