基本情報技術者 2012年 春期 午前(科目A) 問08
問題文
再帰呼出しの説明はどれか。
選択肢
ア:あらかじめ決められた順番ではなく、起きた事象に応じた処理を行うこと
イ:関数の中で自分自身を用いた処理を行うこと(正解)
ウ:処理が終了した関数をメモリから消去せず、必要になったとき再び用いること
エ:処理に失敗したときに、その処理を呼び出す直前の状態に戻すこと
🔒 解説は解答すると表示されます
再帰呼び出し【午前解説】
正解の理由
正解は イ です。再帰呼出しとは関数(または手続き)の定義の中でその関数自身を呼び出すことを指します。再帰は自己参照的に問題を小さな部分問題に分割し、基底条件で停止して結果を統合します。選択肢イはこの定義をそのまま表現しているため正しい説明です。
解法ステップ
- 問題文のキーワード(「再帰呼出し」)から定義を思い出す。
- 各選択肢の文意をチェックし、「関数が自分自身を使う」かどうかで照合する。
- 類似概念(イベント駆動、メモリ保持、ロールバック)と混同していないか排除する。
- 最も定義に合致する選択肢を選ぶ(本問ではイ)。
選択肢別の誤答解説
- ア: 「あらかじめ決められた順番ではなく、起きた事象に応じた処理を行うこと」
→ これはイベント駆動や割り込み、コールバックの説明に近く、再帰の説明ではありません。 - イ: 「関数の中で自分自身を用いた処理を行うこと」
→ 再帰の定義そのもので正解です。基底条件と再帰呼出しの繰返しで問題を解きます。 - ウ: 「処理が終了した関数をメモリから消去せず、必要になったとき再び用いること」
→ これはキャッシュやスワップ、あるいはプロセスのスナップショット復元の説明に近く、再帰とは別物です。 - エ: 「処理に失敗したときに、その処理を呼び出す直前の状態に戻すこと」
→ これはロールバックやトランザクションの説明であり、再帰の説明ではありません。
よくある誤解
- 「再帰=ループの代替」だけと考えてしまう誤解:再帰は確かに反復で代替可能ですが、問題の分割方法や状態保存が異なるため用途や効率が違います。
- 「再帰は必ずメモリを消費する」:関数呼出しごとにスタックフレームは増えますが、末尾再帰最適化や変換により消費が抑えられる場合があります。
- 「再帰は例外的な失敗時にロールバックする仕組み」だと誤認する:再帰は再呼出しの構造であって、トランザクションのロールバックとは無関係です。
補足コラム
再帰はアルゴリズム設計で強力な手法です。例として階乗やフィボナッチ、深さ優先探索、分割統治法(マージソート、クイックソート)などが挙げられます。実行時には各呼出しでコールスタックにスタックフレームが積まれ、基底条件に達するとアンワインド(巻き戻し)されます。適切な基底条件がないと無限再帰となりスタックオーバーフローを招きます。
簡単な例(Python):
# 階乗(再帰)
def factorial(n):
if n == 0:
return 1 # 基底条件
return n * factorial(n - 1)
末尾再帰(再帰呼出しが最後の操作である場合)ではコンパイラ/実行系が最適化してスタックを消費しないことがありますが、Pythonは末尾再帰最適化を行いません。重複計算が多い再帰(例:単純なフィボナッチ)はメモ化で高速化できます。
FAQ
Q1: 再帰と反復(ループ)はどちらを使うべきですか?
A1: 問題の性質によります。再帰は分割統治やツリー構造の処理でコードが簡潔になりやすく、反復はメモリ負荷やオーバーヘッドを抑えやすいです。
A1: 問題の性質によります。再帰は分割統治やツリー構造の処理でコードが簡潔になりやすく、反復はメモリ負荷やオーバーヘッドを抑えやすいです。
Q2: 末尾再帰最適化は全ての言語で使えますか?
A2: いいえ。言語やコンパイラ次第です。Cや一部の関数型言語は最適化する場合がありますが、Pythonは末尾再帰最適化を行いません。
A2: いいえ。言語やコンパイラ次第です。Cや一部の関数型言語は最適化する場合がありますが、Pythonは末尾再帰最適化を行いません。
Q3: 再帰によるスタックオーバーフローを防ぐには?
A3: 基底条件の確認、末尾再帰化(可能なら)、再帰をループに書き換えるか、メモ化や反復アルゴリズムを用いる等の対策があります。
A3: 基底条件の確認、末尾再帰化(可能なら)、再帰をループに書き換えるか、メモ化や反復アルゴリズムを用いる等の対策があります。
Q4: 再帰は常に遅いですか?
A4: 関数呼出しオーバーヘッドはありますが、アルゴリズムの設計次第では非常に効率的です。重複計算を避けるメモ化や動的計画法を併用すると性能改善が可能です。
A4: 関数呼出しオーバーヘッドはありますが、アルゴリズムの設計次第では非常に効率的です。重複計算を避けるメモ化や動的計画法を併用すると性能改善が可能です。
関連キーワード: 再帰、再帰呼び出し、コールスタック、スタックフレーム、基底条件、末尾再帰、メモ化、深さ優先探索、分割統治、スタックオーバーフロー

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

