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

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
另一答案

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

以上是关于当递归函数被调用时,成员变量是否仍在缓冲区中?的主要内容,如果未能解决你的问题,请参考以下文章

堆栈溢出一般是由啥原因导致的?

递归的小栗子

Day3 - Python基础3 函数递归内置函数

java中,当实例化子类时会递归调用父类中的构造方法。这个说法对么?为啥

this指针

详解JavaScript调用栈尾递归和手动优化