基本情報技術者 2017年 秋期 午前(科目A) 問06
問題文
再帰呼出しの説明はどれか。
選択肢
ア:あらかじめ決められた順番ではなく、起きた事象に応じた処理を行うこと
イ:関数の中で自分自身を用いた処理を行うこと(正解)
ウ:処理が終了した関数をメモリから消去せず、必要になったとき再び用いること
エ:処理に失敗したときに、その処理を呼び出す直前の状態に戻すこと
再帰呼出しの説明はどれか。【午前2 解説】
要点まとめ
- 結論:再帰呼出しとは「関数の内部で自分自身を呼び出す」ことであり、問題文ではイが正解です。
- 根拠:再帰は自己呼出しにより問題を同種の小さな部分問題に分割し、基底条件で終了します。
- 差がつくポイント:基底条件(終了条件)と呼出しごとのスタックフレーム管理、尾再帰やメモ化の有無で性能が大きく変わります。
正解の理由
イは「関数の中で自分自身を用いた処理を行うこと」と明確に再帰の定義を示しています。再帰は同じ関数を再度呼び出してより小さな問題へ還元し、最終的に基底条件(終了条件)に到達して巻き戻しながら結果を組み立てます。典型例として階乗計算や二分探索、木の巡回などがあり、これらは関数自身の呼出しで自然に表現できます。従って、イが正解です。
よくある誤解
- 「アはイベント駆動」に見えるが、イベントに応じた処理は再帰とは無関係でありコールバックやイベントループの概念です。
- 「ウはキャッシュや永続保持の誤認」であり、関数を消さずに再利用するのはメモ化や状態保持で再帰の定義ではありません。
- 「エはトランザクションやロールバック」であり、失敗時に状態を戻す処理はエラーハンドリングやトランザクション管理の概念です。
解法ステップ
- 問題文で問われている概念のキーワードを探す(ここでは「再帰呼出し」)。
- 選択肢を短く要約して該当キーワードと照合する(「自分自身を呼ぶ」かどうか)。
- 関連例(階乗、フィボナッチ、木の探索)を頭の中でイメージし、最も一致する選択肢を選ぶ。
- 残り選択肢が別概念(イベント駆動、メモ化、ロールバック)に該当することを確認して除外する。
選択肢別の誤答解説
- ア: あらかじめ決められた順番ではなく、起きた事象に応じた処理を行うこと
→ イベント駆動や割り込み、コールバックの説明であり再帰とは無関係です。 - イ: 関数の中で自分自身を用いた処理を行うこと
→ 正解。これが再帰(recursive call)の定義で、基底条件で停止し巻き戻して結果を作ります。 - ウ: 処理が終了した関数をメモリから消去せず、必要になったとき再び用いること
→ 関数の永続化やキャッシュの誤解。メモ化(memoization)や関数オブジェクトの保持とは異なります。 - エ: 処理に失敗したときに、その処理を呼び出す直前の状態に戻すこと
→ トランザクションのロールバックやエラーハンドリングの説明で、再帰の定義ではありません。
補足コラム
再帰を使うとアルゴリズムが簡潔に書けるケースが多いですが、呼び出しごとにスタックフレームが増えるため深い再帰はスタックオーバーフローにつながります。尾再帰最適化(コンパイラや言語がサポートする場合)はスタック消費を抑えますが、全ての言語で保証されるわけではありません。改善策としては反復(ループ)への書き換えやメモ化(同じ部分問題を再計算しない工夫)があります。
例:階乗の再帰と反復(Python)
# 再帰
def fact_rec(n):
if n <= 1:
return 1
return n * fact_rec(n-1)
# 反復(スタック消費を抑える)
def fact_iter(n):
result = 1
for i in range(2, n+1):
result *= i
return result
FAQ
Q1: 再帰と単なる関数の繰返し呼出しはどう違いますか?
A1: 再帰は「同じ関数が自身を呼ぶ」ことを指します。単なる繰返し呼出しは別関数やループによる反復であり、自己呼出しが要件です。
A1: 再帰は「同じ関数が自身を呼ぶ」ことを指します。単なる繰返し呼出しは別関数やループによる反復であり、自己呼出しが要件です。
Q2: 再帰を使うと常に遅くなりますか?
A2: いいえ。再帰は可読性や自然な表現で有利な場合がありますが、重複計算が多い問題(例:素朴なフィボナッチ)ではメモ化や動的計画法で高速化が必要です。
A2: いいえ。再帰は可読性や自然な表現で有利な場合がありますが、重複計算が多い問題(例:素朴なフィボナッチ)ではメモ化や動的計画法で高速化が必要です。
Q3: 尾再帰って何ですか?
A3: 再帰呼出しが関数の最後に行われ、戻り値の加工が不要な場合を尾再帰と呼び、最適化でスタックを使わずに実行できることがあります。言語やコンパイラ依存です。
A3: 再帰呼出しが関数の最後に行われ、戻り値の加工が不要な場合を尾再帰と呼び、最適化でスタックを使わずに実行できることがあります。言語やコンパイラ依存です。
関連キーワード: 再帰、自己呼出し、基底条件、スタックフレーム、尾再帰、メモ化、スタックオーバーフロー、アルゴリズム

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

