応用情報技術者試験過去問を解いてみた R6年度 春期 問6 木構造、再帰処理

はじめに

今回も、応用情報技術者試験の過去問を解いていきます。
今回は「木構造の再帰処理」に関する問題にチャレンジしました。


問題(R6年度 応用情報技術者試験 春期 午前 問6)

問6
各ノードがもつデータを出力する再帰処理 f(ノード n) を定義した。
この処理を、図の2分木の根(最上位のノード)から始めたときの出力はどれか。

選択肢

ア:+ ÷ - E D × C B A
イ:A B C × D E - ÷ +
ウ:E - D ÷ C × B + A
エ:E D - C B × ÷ A +


解答

正解:エ


解説

🔍 再帰処理の基本的な考え方

「再帰処理(さいきしょり)」とは、関数(処理)自体が“自分自身”を呼び出すこと。
今回のような木構造をたどるときにとても使いやすい方法です。

でも再帰処理では「呼び出したあとすぐ戻るのではなく“保留”になる」という重要な特徴があります。
→ この「保留(スタックに積まれる)」の仕組みが分かると、今回の問題の動きも理解しやすくなります!


📚 スタックとは?

スタックとは:

  • 一番最後に積んだものが、最初に取り出される(LIFO:Last In, First Out)構造
  • 再帰呼び出しでは「まだ終わっていない呼び出し」がどんどん積まれていく
  • 下から順に戻っていく

🌳 今回の問題の流れ

【再帰呼び出しと戻り図】

呼び出し開始 → f(+) ← スタックに積む
  └── 呼び出し f(÷) ← スタックに積む
        └── 呼び出し f(-) ← スタックに積む
              └── 呼び出し f(E) ← スタックに積む → 出力 [E] → 戻る
              └── 呼び出し f(D) ← スタックに積む → 出力 [D] → 戻る
            → 出力 [-] → 戻る
        └── 呼び出し f(×) ← スタックに積む
              └── 呼び出し f(C) ← スタックに積む → 出力 [C] → 戻る
              └── 呼び出し f(B) ← スタックに積む → 出力 [B] → 戻る
            → 出力 [×] → 戻る
      → 出力 [÷] → 戻る
  └── 呼び出し f(A) ← スタックに積む → 出力 [A] → 戻る
→ 出力 [+]


一部の処理まで順を追って解説

【f(ノード n) の定義 再掲】

1️⃣ 右に子ノード r があれば、f(ノード r) を実行
2️⃣ 左に子ノード l があれば、f(ノード l) を実行
3️⃣ 未実行の子ノードがなければ、自分のデータを出力
4️⃣ 終了


【対象の木構造 全体図(再掲)】


🌟 スタート地点 → f(+) 呼び出し!

🔸 ステップ 1: f(+) の呼び出し開始

いまノード:+

✅ 1️⃣ 右に子ノード ÷ がある → f(÷) を実行!

f(+) はスタックに積まれたまま、 f(÷) 呼び出しへ


🔸 ステップ 2: f(÷) の呼び出し開始

いまノード:÷

✅ 1️⃣ 右に子ノード - がある → f(-) を実行!

f(÷) はスタックに積まれたまま、 f(-) 呼び出しへ


🔸 ステップ 3: f(-) の呼び出し開始

いまノード:-

✅ 1️⃣ 右に子ノード E がある → f(E) を実行!

f(-) はスタックに積まれたまま、 f(E) 呼び出しへ


🔸 ステップ 4: f(E) の処理

いまノード:E(葉ノード)

✅ 1️⃣ 右なし → スキップ
✅ 2️⃣ 左なし → スキップ
✅ 3️⃣ 未実行の子がない → E を出力!

→ 出力:[E]

→ f(E) 完了 → 呼び出し元(f(-))へ戻る


🔸 ステップ 5: f(-) に戻る

戻ってきた f(-) の状態:

✅ 右の子(E)は 実行済み
✅ 2️⃣ 左に子ノード D がある → f(D) を実行!


🔸 ステップ 6: f(D) の処理

いまノード:D(葉ノード)

✅ 1️⃣ 右なし → スキップ
✅ 2️⃣ 左なし → スキップ
✅ 3️⃣ 未実行の子がない → D を出力!

→ 出力:[D]

→ f(D) 完了 → 呼び出し元(f(-))へ戻る


🔸 ステップ 7: f(-) に戻る(左右とも完了)

戻ってきた f(-) の状態:

✅ 右の子 E → 実行済み
✅ 左の子 D → 実行済み
✅ 3️⃣ 未実行の子がない → - を出力!

→ 出力:[-]


✅ ここまでの出力結果

E → D → -


✅ これを繰り返すと…

E → D → - → C → B → × → ÷ → A → +

正解:エ

となります。


💡 迷いやすいポイント

✅ よくある疑問 → 「E にたどり着いたあと、次は D を処理?それとも - を出力?」

→ これは「親ノード(-)の中で、“未実行の子” があるかどうか」を見るのがコツ!

✅ E から戻ってきたとき、f(-) の処理はまだ「左の子 D」を未実行なので、
→ 次は D を呼び出すべき!
→ 左右両方の子を実行し終えた時点で、はじめて「-」が出力される。


問題の用語解説

用語意味
木構造(ツリー構造)ノードが親子関係を持つデータ構造。
根(root)最上位のノード(+)
葉(leaf)子を持たないノード(A, B, C, D, E)
再帰処理自分自身を呼び出す処理。木構造や分割統治法で使う。
スタックLIFO のデータ構造。再帰呼び出しの時に「保留」に使われる。
未実行の子まだ呼んでいない子ノードのこと。親ノード出力はその後になる。

体系的位置づけ


まとめ

✅ 再帰処理は「自分自身を呼ぶ」処理方法
✅ 呼び出した時に「保留(スタックに積む)」の動きを理解するのがカギ
✅ 未実行の子が残っているうちは親は出力しないというルールを押さえる
✅ 木構造の問題は毎年〜隔年で出やすいテーマなので、再帰+スタックの流れを身につけておくと安心!


参考情報

  • IPA 応用情報技術者試験 過去問題:
    https://www.ipa.go.jp/shiken/mondai-kaiotu/2024r06.html

コメント

タイトルとURLをコピーしました