戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

応用情報技術者 2017年 春期 午前207


問題文

プログラムの特性に関する記述のうち、適切なものはどれか。

選択肢

再帰的プログラムは、手続の中でそれ自体を呼び出すプログラムであり、再入 可能である。(正解)
再使用可能プログラムは、一度実行したプログラムを主記憶装置上にロードし 直さずに再度実行できるプログラムであり、再入可能である。
再入可能プログラムは、複数のタスクから同時に呼び出されたときに、並列に 実行できるプログラムであるが、再配置可能ではない。
再配置可能プログラムは、主記憶装置上のどの領域にロードされても実行可能 なプログラムであるが、再使用可能ではない。

🔒 解説は解答すると表示されます

再入可能プログラム【午前2解説】

正解の理由

設問で最も適切なのは です。選択肢の前半は「再帰的プログラム=手続の中でそれ自体を呼び出すもの」という定義として正しく、後半の「再入可能である」という記述は、一般的な実装条件(各呼び出しが独立したスタック領域を持ち、共有可変状態を使わない)を満たす場合に成り立つため、試験文脈で最も妥当と判断されます。
ただし重要な点として、再帰だから必ず再入可能になるわけではありません。再入可能性が成立するための条件(後述)を満たすことが前提です。選択肢の他の記述は用語定義や因果関係の誤りがあるため不適切です。

解法ステップ

  1. 各用語の定義を頭の中で整理する(再帰的、再入可能、再使用可能、再配置可能)。
  2. 選択肢ごとに「定義が正しいか」「後半の因果/包含関係が正しいか」を検証する。
  3. 「〜であるが、〜ではない」などの否定表現は特に注意し、互いに排反する主張が矛盾していないかを確認する。
  4. 実用上の前提条件(共有状態の有無、静的変数、ライブラリ関数の再入性など)も考慮して最も妥当な選択肢を選ぶ。

選択肢別の誤答解説

  • ア: 再帰的プログラムの定義は正しい。再入可能である点は「再帰呼び出しごとに独立した呼び出し環境(スタックフレーム)を持ち、共有可変データや静的変数、非再入可能なライブラリ呼び出しを行わない」ことを前提にすると正しいため、選択肢の中で最も適切である。
  • イ: 「再使用可能プログラム」を「一度ロードしたまま再度実行できる」と定義しているが、これは単にメモリ上に残すこと(常駐)に関する記述で、再使用可能(reusable)はモジュールや部品として再利用できる設計(モジュール性、依存性の低さ)を指すことが多い。さらに「再入可能である」と断定するのも誤り(再使用可能=再入可能ではない)。
  • ウ: 「再入可能プログラムは複数のタスクから同時に呼ばれ並列実行できる」は概ね再入可能(reentrant)の目的に合うが、続く「が、再配置可能ではない」の部分が誤り。再入可能性と再配置可能性は独立した属性であり、再入可能なプログラムが必ずしも再配置不可能になるわけではない。
  • エ: 「再配置可能プログラムはどの領域にロードされても実行可能」という定義は再配置可能(relocatable/position-independent)の要旨をつかんでいるが、「が、再使用可能ではない」と断定するのは誤り。再配置可能であっても再使用可能である場合があり、二者は排他的な関係ではない。

よくある誤解

  • 再帰 = 常に再入可能:再帰関数でも静的変数やグローバル可変状態を使えば再入可能ではありません。再入可能性は実装(状態管理)に依存します。
  • 再入可能とスレッド安全は同義:関連はありますが異なります。再入可能は同時呼び出しでデータ競合を起こさないこと、スレッド安全は複数スレッド下で正しく動作すること(ロック等で実現することもある)で、実現方法が異なります。
  • 再配置可能と再入可能を混同:再配置可能はメモリ上の配置変更に耐えること、再入可能は同時再呼び出しに耐えること。目的が違います。

補足コラム

再入可能(reentrant)であるための代表的条件:
  • ローカル変数のみを用い、各呼び出しが独立したスタックフレームを持つこと。
  • 静的変数やグローバルの可変データを使わないこと(使う場合は呼び出しごとに別管理する)。
  • 非再入可能なライブラリ関数(例:内部に静的バッファを持つもの)を呼ばないこと。
  • 副作用のある共有リソースを操作する場合は外部で同期管理すること。
例:C言語での非再入可能な再帰例(静的変数使用)
int counter() {
    static int cnt = 0; // 静的変数があるため再入可能でない
    return ++cnt;
}
このような関数は再帰呼び出しや複数タスクからの同時呼び出しで状態が競合します。再入可能にするには静的変数を使わず、呼び出し元でカウントを保持して渡す設計にします。
再入可能と「async-signal-safe」(シグナルハンドラ内で安全に呼べるか)や「スレッド安全性」は相互に関連する概念ですが、テストでは定義の違いを押さえておくことが重要です。

FAQ

Q1. 再帰関数はテスト上「再入可能」と判断してよいですか?
A1. 問題文上は「再帰的=自分を呼ぶ手続」である点は正しく、試験問題では実装条件(スタックベースで共有状態を使わない)が暗黙の前提とされていることが多いです。ただし実際のコード評価では上記条件の確認が必要です。
Q2. 再配置可能と再使用可能の違いは?
A2. 再配置可能はメモリ上の任意の位置にロードして実行可能な性質(位置依存コードでないか、リエントリやリンク情報で対応)です。再使用可能はモジュールやライブラリとして他のプログラムで再利用できる設計性を指します。概念が異なるため相互に排他的ではありません。
Q3. 再入可能とスレッド安全、どちらを覚えればよい?
A3. 両方とも押さえてください。試験では用語定義や相違点を問う出題があるため、再入可能(同時呼び出しに耐える)とスレッド安全(スレッド環境下で正しい動作を保証する)の違いを説明できることが望ましいです。

関連キーワード: 再帰, 再入可能性, 再配置可能, 再使用可能, スタックフレーム, 静的変数, スレッド安全, 非再入可能ライブラリ, コンカレンシー, 位置独立コード
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

応用情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について