为了账号安全,请及时绑定邮箱和手机立即绑定

调用递归函数时,成员变量是否仍在缓冲区中?

调用递归函数时,成员变量是否仍在缓冲区中?

翻翻过去那场雪 2022-06-08 17:09:51
我试图了解每次调用递归函数时成员变量是否仍在缓冲区中。这是我的代码: public static int gcd(int m,int n){    System.out.println("Entering 'gcd' method:  m= "+m+",  n="+n);    if(m%n==0)    {                System.out.println("Returning 'gcd' value ="+n+" (Base case:      m=)"+m+",  n="+n );            return n;    }    else              {        int temp= gcd(n,m%n);        System.out.println("Returning 'gcd' value ="+temp+" (recursive case:      m=)"+m+",  n="+n );        return temp;    }我不明白当我在返回温度之前输入 843 99 System.out.println 时。会变成反向打印出来的M和N例如:enter two integers(or 'q' to exit):843 99Entering 'gcd' method:  m= 843,  n=99Entering 'gcd' method:  m= 99,  n=51Entering 'gcd' method:  m= 51,  n=48Entering 'gcd' method:  m= 48,  n=3Returning 'gcd' value =3 (Base case:      m=)48,  n=3Returning 'gcd' value =3 (recursive case:      m=)51,  n=48Returning 'gcd' value =3 (recursive case:      m=)99,  n=51Returning 'gcd' value =3 (recursive case:      m=)843,  n=99The GCD of  843 and99 is 3
查看完整描述

2 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

递归调用在打印输出之前出现一行。因此,第一个输出将是基本情况,最后一个输出将是递归函数的第一级。这就是为什么您以相反的顺序获得输出的原因。



查看完整回答
反对 回复 2022-06-08
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

发生这种情况是因为方法调用的状态存储在堆栈(称为“调用堆栈”)中。


您可能知道,堆栈是一种先进后出数据结构。这意味着如果您按顺序将项目 A、B、C 和 D 压入堆栈,则从堆栈中弹出的第一项将是 D,而您弹出的最后一项将是 A。


每当您从方法 A 调用方法 B 时,B 都会被压入调用堆栈并位于 A 之上。B 会做它的事情,当它返回时,它会从堆栈中弹出,而 A 将继续执行它原来的操作正在做。


因此,第一个调用gcd将最后弹出,最后一个调用将首先弹出,两者之间的所有内容都被反转。


可以使用以下命令“模拟”此行为java.util.Stack:


Stack<String> stack = new Stack<>();

for(int i = 0 ; i < 5 ; i++) {

    // simulating calling gcd recursively

    String s = "Call #" + i + " of gcd";

    stack.push(s);

    System.out.println(s);

}


for (int i = 0 ; i < 5 ; i++) {

    // simulating returning from all the calls to gcd

    System.out.print("Returning from ");

    System.out.println(stack.pop());

}

它打印:


Call #0 of gcd

Call #1 of gcd

Call #2 of gcd

Call #3 of gcd

Call #4 of gcd

Returning from Call #4 of gcd

Returning from Call #3 of gcd

Returning from Call #2 of gcd

Returning from Call #1 of gcd

Returning from Call #0 of gcd


查看完整回答
反对 回复 2022-06-08
  • 2 回答
  • 0 关注
  • 159 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号