递归跟踪java中的递归调用?
递归调用如何处理堆栈?我有一个示例代码,其中第B
行printsB 654321
、c
行printsC
、d
行printsD 2468
和e
行抛出一个异常。我不明白程序为什么要打印这些输出!例如,在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 楼答案
堆栈,考虑一个较小的堆栈:123(在堆栈顶部有3个)。 设F1为stackStack()
的第一个调用,F2为嵌套调用,依此类推F1:
stackStack(123)
弹出3并将其存储在x中。所以x_1=3
和s=12
F2:
stackStack(12)
现在被调用。所以x_2=2
和s=1
F3:现在
stackStack(1)
被调用。现在,x_3=1
和s
是空的现在,
s
是空的。因此,控件只返回F3F3然后将
x_3 =1
推到空的s
上。所以s=1
控件返回到F2F2将
x_2=2
推到s=1
上。所以s=12
控制返回F1F1将
x_1=3
推到s=12
上。所以s=123
您刚刚得到了原始堆栈,
printStack()
只需打印出321这会让你大致了解递归的工作原理