跟踪Java中的递归调用?

时间:2018-07-23 15:23:09

标签: java recursion stack

递归调用如何与堆栈一起使用?我有此示例代码,其中行B打印B 654321c打印Cd打印D 2468e一个例外。我不明白为什么程序要打印这些输出!例如,在B行中,s是否由于堆栈而变成0?谢谢

public class Problem1 { 
public static void main(String args[]) { 
    Stack<Integer> s = setStack(5); printStack("A",      s); // line A 
    s = setStack(6); stackStack(s); printStack("B", s); // line B 
    s = setStack(8); cutStack(s); printStack("C", s); // line C 
    s = setStack(8); s = cutStack(s); printStack("D", s); // line D 
    s = setStack(7); s = cutStack(s); printStack("E", s); // line E 
} 
public static Stack<Integer> setStack(int n) {     
  Stack<Integer> ans = new Stack<>(); 
    for (int i = 1; i <= n; i++) 
        ans.push(i); 
    return ans; 
    }
public static void printStack(String tag, Stack<Integer> s) { 
  System.out.print(tag + " "); 
  while (!s.empty()) System.out.print(s.pop());    
  System.out.println(); 
 } 
public static Stack<Integer> cutStack(Stack<Integer> s)  
  { 
  Stack<Integer> ans = new Stack<>(); 
  while (!s.empty()) { 
     ans.push(s.pop()); 
     s.pop();
  } 
  s = ans; return s;
} 
public static void stackStack(Stack<Integer> s) { 
   if (s.empty()) return; 
   int x = s.pop(); 
   stackStack(s); 
   s.push(x); 
}
}

1 个答案:

答案 0 :(得分:0)

对于stackStack,请考虑使用较小的堆栈:123(堆栈顶部为3)。 假设F1是对stackStack()的第一个调用,F2是嵌套的调用,依此类推。

F1:stackStack(123)弹出3并将其存储在x中。所以x_1=3s=12

F2:现在调用stackStack(12)。所以x_2=2s=1

F3:现在调用stackStack(1)。现在,x_3=1s为空。

现在,s为空。因此,控件只需返回F3。

F3然后将x_3 =1推入空白s上。因此s=1,控件返回到F2。

F2将x_2=2推到s=1上。这样s=12,控件返回到F1。

F1将x_1=3推到s=12上。 s=123

您刚刚获得了原始堆栈,而printStack()仅打印出321。

这应该使您大致了解递归的工作原理。

相关问题