如何理解
我们知道在方法中可以通过在方法A内写的代码,调动方法B,这样就形成了顺序式的按需调用。而递归则是在方法A中调用方法A,循环调用即自己调用自己。
情景导入
情景一:讲个故事
从前有座山山里有座庙,庙里有个老和尚再给小和尚讲故事,讲的是
从前有座山山里有座庙,庙里有个老和尚再给小和尚讲故事,讲的是
从前有座山山里有座庙,庙里有个老和尚再给小和尚讲故事,讲的是
情景二:来段代码
public static void main(String[] args){
int num=add(2,2);
System.out.println("运算结果:"+num);
}
public static int add(int num,int i){
if(num>0){
System.out.println("传参i:"+i);
num=num+add(num-1,i-1);
System.out.println("递归结束后:"+i);
return num;
}else{
//终止
return 0;
}
}
分析:
第一次调用相当于按下了启动核爆炸按钮,之后便会接连不断地发生内部反映。当然程序不是核弹,所以这里是的是运算,为了不让运算一直进行下去这里也使用了判断,使程序变得可控,防止发生内存泄漏。计算过程
int num=num+add(1)
=
2+1
=
3
控制台输出
传参i:2
传参i:1
递归结束后:1
递归结束后:2
运算结果:3
看到这里如果能完整的理解程序,当内部使用递归后,后面的代码的执行顺序也就一目了然了。代码是按照顺序执行的,当程序内部运行到调用自身函数的代码时,相当于把代码顺序重置,所以才控制台才会先出现两个传参i的数字。那后面的代码是不是就不运行了呢?不是的,我们可以把递归算法看成两个部分,一是递归,二是回溯。
add(3)内调用add(2),add(2)内调用add(1),每个方法都是独立的状态有自己的空间
递归就是不断调用本身方法执行其内部代码,回溯就相当于从高处扔下一个棒球触底反弹的过程就是递归节点结束后运行代码的顺序,我们在控制台也可以看到传参i和递归结束后呈对称关系,即2对2、1对1,中间则是先运行的传参i:1,然后紧接着的是递归结束后:1 总结来说,当运行到递归代码,就循环重复当前方法,递归后面的代码被递归代码提前插队只保存了状态,需要等所有递归结束后才会输出。