我试图了解每次调用递归函数时成员变量是否仍在缓冲区中。
这是我的代码:
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 99
Entering 'gcd' method: m= 843, n=99
Entering 'gcd' method: m= 99, n=51
Entering 'gcd' method: m= 51, n=48
Entering 'gcd' method: m= 48, n=3
Returning 'gcd' value =3 (Base case: m=)48, n=3
Returning 'gcd' value =3 (recursive case: m=)51, n=48
Returning 'gcd' value =3 (recursive case: m=)99, n=51
Returning 'gcd' value =3 (recursive case: m=)843, n=99
The GCD of 843 and99 is 3
最佳答案
发生这种情况是因为方法调用的状态存储在堆栈中(称为“调用堆栈”)。
正如您所知,堆栈是先进后出的数据结构。这意味着,如果您按顺序将项目 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
关于java - 当递归函数被调用时,成员变量是否仍在缓冲区中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54567274/