连续两次递归其执行过程

递归函数和栈的关系:递归函数的运行其实就是前行和退回。递归过程退回的顺序是前行顺序的逆序。在退回过程中,可能要执行某些动作,包括恢复在前行过程中存储起来的某些顺序。这种退回返回顺序很符合栈数据结构特征,所以编译器就是用栈实现递归,也就是说,对于每一层递归,函数的局部变量、参数值以及返回地址 都被压人栈中。在退回的阶段,位于栈顶的局部变量、参数值和返回地址都被弹出,用于返回调用层次中执行代码的其他部分(此处参考https://blog.csdn.net/Sun9528/article/details/78669372

 

代码: 连续两次递归;递归是入栈操作,把数据放入栈中,假如n=5

执行第一次递归count(n-1),直到条件不满足n>0,第一次递归结束栈的结果表示

 

private static void count(int n){
   
if (n>0){
       
System.out.println("执行前n1:"+n);
       
count(n-1);
       
System.out.println("执行后n1:"+n);
       
count(n-2);
       
System.out.println("执行后n2:"+n);
   
}
   
System.out.println("最后输出:"+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栈的元素移除完结束

  • 7
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值