递归函数和栈的关系:递归函数的运行其实就是前行和退回。递归过程退回的顺序是前行顺序的逆序。在退回过程中,可能要执行某些动作,包括恢复在前行过程中存储起来的某些顺序。这种退回返回顺序很符合栈数据结构特征,所以编译器就是用栈实现递归,也就是说,对于每一层递归,函数的局部变量、参数值以及返回地址 都被压人栈中。在退回的阶段,位于栈顶的局部变量、参数值和返回地址都被弹出,用于返回调用层次中执行代码的其他部分(此处参考https://blog.youkuaiyun.com/Sun9528/article/details/78669372)
代码: 连续两次递归;递归是入栈操作,把数据放入栈中,假如n=5
执行第一次递归count(n-1),直到条件不满足n>0,第一次递归结束栈的结果表示
private static void count(int n){ |
Stack1
1 |
2 |
3 |
4 |
5 |
deBug结果:第一次递归结束:
当n<=0时,执行最后一行输出最后结果为0;
开始执行第二次递归也就是count(n-2);从栈Stack1取数据栈顶数据1,但是栈顶数据并未移除
执行第二次递归count(n-2),此时 n=-1,不满足条件直接输出结果为-1;
在输出最后结果之后,会执行System.out.println("执行后n2:"+n);输出并移除栈Stack1的栈顶1,到此此次递归结束
Stack1
2 |
3 |
4 |
5 |
然后取栈Stack1新的栈顶元素2
由于count(2-2)得n=0直接输出结果0,取出并移除Stack1栈顶元素2
Stack1
3 |
4 |
5 |
依次取新得栈顶元素3
由于conut(3-2)得n=1, 满足条件,会执行第一次递归count(n-1)并把1压入Stack2的栈顶
Stack1
3 |
4 |
5 |
Stack2
1 |
取出栈Stack2栈顶元素由于count(1-1)得n=0 ,不满足条件直接输出最后结果 0;
输出并移除stack2栈顶元素,此时是stack2为空栈,输出并移除Stack1栈顶元素3;
Stack1
4 |
5 |
Stack2
依次类推
取stack1 栈顶n=4
Stack1
4 |
5 |
Stack2
1 |
2 |
直到把Stack1栈的元素移除完结束