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

标签 java recursion stack

我试图了解每次调用递归函数时成员变量是否仍在缓冲区中。

这是我的代码:

 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/

相关文章:

java - 调用java函数时出现问题,只能先找到匹配项..关闭?重置?处置?

java - 在不使用 .cpp 的情况下使用存档文件中的函数

java - 递归方法中ArrayList的状态

连接图的 C++ 递归

recursion - 字符串缩减 - 编程竞赛。需要解决方案

C - 指向 int 的指针以获取堆栈中的元素

c++ - 基于栈的虚拟机函数调用/返回实现问题

java - Mac OSX - IllegalStateException : The driver is not executable:

java - Spring RestTemplate 响应时间慢

Java/Android - 如何打印出完整的堆栈跟踪?