再帰呼び出しはスタックでどのように機能しますか?私はこのサンプルコードを持っています。このサンプルコードでは、行が例外をB
印刷B 654321
、c
印刷C
、d
印刷D 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);
}
}
stackStackの場合、より小さなスタックを検討します: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
は空です。したがって、コントロールは単にF3に戻ります。
次に、F3x_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を出力するだけです。
これにより、再帰が一般的にどのように機能するかがわかります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加