当递归函数被调用时,成员变量是否仍在缓冲区中?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了当递归函数被调用时,成员变量是否仍在缓冲区中?相关的知识,希望对你有一定的参考价值。
我试图了解当递归函数每次调用时,成员变量是否仍然在缓冲区中。
这是我的代码:
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;
}
当我在返回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
另一答案
递归调用在打印输出之前出现一行。因此,第一个输出将是基本情况,最后一个输出将是递归函数的第一个级别。这就是为什么你以相反的顺序得到输出。
以上是关于当递归函数被调用时,成员变量是否仍在缓冲区中?的主要内容,如果未能解决你的问题,请参考以下文章