応用情報技術者試験 科目A 第6回:擬似言語・再帰・計算量・状態遷移
応用情報技術者試験の科目Aに必要な擬似言語のトレース、繰返しの終了とユークリッドの互除法、再帰の呼出しと戻り、正確な実行回数と計算量、状態遷移表を、例題とオリジナル演習問題5問で学びます。
AP科目A・第6回 · 2026年度・シラバスVer.7.2に基づく独立した学習資料です。IPAとの提携はなく、合格を保証しません。 シリーズ一覧を見る
改訂日: 2026-10-20 範囲: 2026年の試験対策。IPA「応用情報技術者試験(レベル3)シラバス Ver.7.2」に基づきます。 ご注意: 試験の範囲や形式は変わることがあります。受験前に必ずIPAの最新の公式情報を確認してください。本記事は学習補助資料であり、合格を保証するものではありません。また、IPAが作成または承認した資料ではありません。
前提知識:探索・整列アルゴリズムの概要と計算量の比較は第5回で扱いました。今回はその内容を繰り返さず、どんなアルゴリズムでも手でトレースし、止まることを確かめ、コストを数え、状態の変化として読む方法に絞って解説します。
1. 学習インデックスと目標
| 節 | 内容 | 読み終えたらできるようになること |
|---|---|---|
| 2 | 用語対応表 | 日本語・韓国語・英語の用語を相互に読み替えられる |
| 3 | 本記事の擬似言語表記 | 代入(←)と等価比較(=)を区別し、繰返し範囲を正確に読める |
| 4 | トレースの方法・例題1 | チェックポイントを決め、トレース表を1行ずつ正確に埋められる |
| 5 | 繰返しの終了・例題2 | 初期化・条件・更新を点検し、ユークリッドの互除法をトレースできる |
| 6 | 再帰・例題3 | 呼出し(降りる)と戻り(戻る)を分けてトレースできる |
| 7 | 計算量・例題4 | 正確な実行回数を数え、Θ/Oで要約できる |
| 8 | 状態遷移・例題5 | 状態遷移表を読み、入力列に対する状態の変化をトレースできる |
| 9 | オリジナル練習問題5問 | 上の五つの技能をそれぞれ問題に適用できる |
| 10–13 | クイックシート・落とし穴・セルフチェック・復習 | 要点を短く復習し、弱点を点検できる |
2. 用語対応表
| 韓国語 | 日本語 | English |
|---|---|---|
| 의사코드 | 擬似言語(擬似コード) | pseudocode |
| 대입 | 代入 | assignment |
| 같음 비교 | 等価比較(等しいかの比較) | equality comparison |
| 조건 | 条件 | condition |
| 분기 | 分岐(選択) | branch |
| 반복(루프) | 繰返し(ループ) | loop |
| 반복 1회(이터레이션) | 繰返し1回分(反復) | iteration |
| 반복 조건(계속 조건) | 繰返し条件(継続条件) | loop condition |
| 종료 조건 | 終了条件 | termination condition |
| 초기화 | 初期化 | initialization |
| 갱신 | 更新 | update |
| 추적표 | トレース表 | trace table |
| 상태 | 状態 | state |
| 상태 전이 | 状態遷移 | state transition |
| 상태 전이표 / 상태 전이도 | 状態遷移表 / 状態遷移図 | transition table / transition diagram |
| 재귀 호출 | 再帰呼出し | recursive call |
| 기저 사례(종료 사례) | 基底部(再帰の終了条件) | base case |
| 호출 스택 | 呼出しスタック(コールスタック) | call stack |
| 반환값 | 戻り値(返却値) | return value |
| 시간 계산량 / 공간(영역) 계산량 | 時間計算量 / 領域計算量 | time complexity / space complexity |
| 정확한 연산 횟수 | 正確な演算回数(実行回数) | exact operation count |
| 빅오 표기 | オーダー記法(O記法) | Big-O notation |
3. 本記事だけで使う擬似言語表記
以下の表記は本記事の解説と練習問題のために定めたもので、IPAの試験で使われる公式の表記と同一だとは主張しません。実際の試験問題では記号が別の意味で定義されることがあり、その場合は常に問題文の定義が優先されます。
| 表記 | 意味 |
|---|---|
x ← e |
式 e の値を求めてから変数 x に格納する(代入)。 |
a = b |
a と b が等しいかを比較する(真/偽)。代入ではない。 |
≠, <, ≤, >, ≥ |
比較演算子。 |
a div b |
整数除算の商。本記事では非負の整数にだけ使う。例:7 div 2 = 3。 |
a mod b |
整数除算の余り。本記事では非負の a と正の b にだけ使う。例:48 mod 18 = 12。 |
for i ← a to b |
i を a から b まで1ずつ増やしながら繰り返す。両端を含む。a > b なら一度も実行しない。 |
while 条件 |
前判定:各繰返しを始める前に条件を評価し、真である間は続ける。最初から偽なら本体は0回実行される。 |
if 条件 … else … |
条件が真なら最初のブロック、偽なら else のブロックを実行する。 |
A[i] |
配列 A の i 番目の要素。本記事では添字は1から始まる(A[1] が先頭要素)と定める。 |
return e |
現在の呼出しを終え、e の値を呼出し元に返す。 |
output e |
e の値を出力する。 |
| 字下げ | 同じ字下げの深さの文が一つのブロックを作る。 |
本記事の例題と問題では and/or のような複合条件を使わないため、短絡評価は前提にしません。
4. トレースの方法
手によるトレースは「なんとなく頭の中で動かす」ことではなく、規則に従った記録です。次の手順を守ると、ミスが大きく減ります。
- 初期状態を固定する。 繰返しに入る前のすべての変数の値を最初の行(初期行)に書きます。
- 一度に1文(または1回の繰返し)ずつ実行する。 複数の文を頭の中でまとめて処理しません。
- チェックポイントを定義し、その時点でだけ記録する。 例:「繰返し本体のすべての文を実行した直後」。表の1行がいつの状態かを先に決めます。
- 古い値と新しい値を区別する。
total ← total + xの右辺のxは、この文を実行する瞬間の値です。同じ繰返しの後ろにあるx ← 2 * xはまだ反映されていません。 - 条件判定も記録する。
whileの条件が真/偽になった時点が繰返し回数を決めます。 - 出力と最終状態を確認する。 繰返しを抜けた後に何が出力されるか、各変数の最終値は何かを別に書きます。
例題1:変数のトレース
x ← 1
total ← 0
while x ≤ 8
total ← total + x
x ← 2 * x
output total
行の意味: 繰返しkの行 =「k回目の繰返しで total ← total + x と x ← 2 * x を両方実行した直後」の状態。
| 行 | 判定時の x(条件 x ≤ 8) |
実行後の x | 実行後の total |
|---|---|---|---|
| 初期 | — | 1 | 0 |
| 繰返し1 | 1 ≤ 8 真 | 2 | 1(= 0 + 1) |
| 繰返し2 | 2 ≤ 8 真 | 4 | 3(= 1 + 2) |
| 繰返し3 | 4 ≤ 8 真 | 8 | 7(= 3 + 4) |
| 繰返し4 | 8 ≤ 8 真 | 16 | 15(= 7 + 8) |
| 終了判定 | 16 ≤ 8 偽 | — | — |
- 繰返し回数:4回。チェックポイント行の (x, total) は (2,1) → (4,3) → (8,7) → (16,15)。
- 出力:15。最終状態:
x = 16、total = 15。 - 落とし穴:条件が
≤なので、x = 8のときも本体を実行します。<と読み違えると3回、出力7になります。
5. 繰返しの終了
while の繰返しを意図どおりに終わらせるには、次の三つをまとめて点検します。
- 初期化: 繰返しの前に変数が正しい値を持っているか。
- 条件:
whileの後ろの条件は継続条件です。「いつ止まるか」(終了条件)はその否定です。例:while b ≠ 0の終了条件はb = 0。終了条件をそのままwhileの後ろに書くと、繰返しがまったく始まらなかったり、おかしな動きをしたりします。 - 更新(進行): 毎回の繰返しで、条件を偽の方向へ動かす変化があるか。
典型的な落とし穴
- 1ずれ(off-by-one):
<と≤、開始値0と1を取り違え、1回多く、または少なく実行してしまいます。繰返し回数は「最初の値・最後の値・条件」を実際に当てはめて確認します。 - 進行なし: 更新の文を書き忘れたり、条件と関係のない変数を更新したりすると、無限ループになります。
変量(ランキング関数)の直感: 繰返しのたびに真に減少し、繰返しが続く間はある下限より下がれない整数値を一つ見つけられれば、繰返しは必ず有限回で終わります。例題1では 9 − x が 8, 7, 5, 1 と減り、1未満になる(条件 x ≤ 8 が偽になる)と繰返しが止まります。試験では厳密な証明よりも、「毎回何が減っているか」を考える感覚で十分です。
例題2:ユークリッドの互除法 (48, 18)
a ← 48
b ← 18
while b ≠ 0
r ← a mod b
a ← b
b ← r
output a
行の意味: 繰返しkの行 =「k回目の繰返しの3文をすべて実行した直後」の (a, b)。
| 行 | 判定(b ≠ 0) |
r = a mod b(古い a、古い b を使う) | 実行後の (a, b) |
|---|---|---|---|
| 初期 | — | — | (48, 18) |
| 繰返し1 | 18 ≠ 0 真 | 48 mod 18 = 12(48 = 18×2 + 12) | (18, 12) |
| 繰返し2 | 12 ≠ 0 真 | 18 mod 12 = 6(18 = 12×1 + 6) | (12, 6) |
| 繰返し3 | 6 ≠ 0 真 | 12 mod 6 = 0(12 = 6×2 + 0) | (6, 0) |
| 終了判定 | 0 ≠ 0 偽 | — | — |
- 状態の変化:(48,18) → (18,12) → (12,6) → (6,0)。繰返し3回、出力6(48と18の最大公約数)。
- 終了する理由(変量):余り
rは常に0 ≤ r < bなので、新しいbは古いbより真に小さく、0以上です。非負の整数が無限に減り続けることはできないので、必ずb = 0に到達します。 - 落とし穴:
a ← bとb ← rの順序を入れ替える(b ← rを先に実行する)と、aに新しいbが入り、結果が誤りになります。一時変数rは古い値を保存する役割を持っています。
6. 再帰
再帰関数は自分自身を呼び出します。トレースするときは二つの段階を分けて考えます。
- 降りる(呼出し): 基底部に達するまで呼出しが積み重なります。この時点ではまだどの計算も完了しておらず、すべて「保留中」です。
- 戻る(戻り): 基底部が値を返すと、最も新しい呼出しから逆順に計算を終えて値を返します。
重要な規則:
- すべての再帰の経路は基底部に向かって進まなければなりません。 引数が基底部に近づかない経路があると、呼出しが際限なく積み重なります。
- 実行中の各呼出しは、自分専用の引数と局所変数を呼出しスタック上に持ちます。 F(5) の中の
nと F(3) の中のnは別の変数です。 - 呼出しスタックは後入れ先出し(LIFO)です。そのため、呼出しの順序と戻りの順序は逆になります。
例題3:F(5) の呼出しと戻り
F(n):
if n ≤ 1
return 1
else
return n + F(n − 2)
呼出し(降りる)順序
| 段階 | 呼出し | n | 動作 | スタックの深さ(呼出し後) |
|---|---|---|---|---|
| C1 | F(5) | 5 | 5 ≤ 1 偽 → 5 + F(3) を保留 |
1 |
| C2 | F(3) | 3 | 3 ≤ 1 偽 → 3 + F(1) を保留 |
2 |
| C3 | F(1) | 1 | 1 ≤ 1 真 → 基底部 | 3 |
戻り(戻る)順序
| 段階 | 戻る呼出し | 計算 | 戻り値 |
|---|---|---|---|
| R1 | F(1) | 基底部 | 1 |
| R2 | F(3) | 3 + 1 | 4 |
| R3 | F(5) | 5 + 4 | 9 |
- 展開:F(5) = 5 + F(3) = 5 + 3 + F(1) = 5 + 3 + 1 = 9。
- 呼出しの順序は F(5), F(3), F(1)。戻りの順序は F(1), F(3), F(5) で、戻り値は 1, 4, 9。
- コスト: n ≥ 1 のとき、呼出し回数は ⌊n/2⌋ + 1(同値な表現では ⌈(n + 1)/2⌉)、つまりおよそ n/2 回で、各呼出しの処理は定数です。計算量の表記では定数倍(1/2)を無視するので、時間は Θ(n) です。同じ理由で、同時に積み重なる呼出しの最大数(呼出しスタックの深さ)も Θ(n) であり、追加の領域が Θ(n) 必要になることを意味します。
- この定義では、1回の呼出しの中で再帰呼出しが1回だけなので、呼出し回数は線形です。1回の呼出しの中で再帰呼出しが2回起こる定義とは計算量が異なるので、混同しないでください。
7. 計算量
計算量は、入力の大きさ n に応じて実行回数(またはメモリ使用量)がどのように増えるかを表します。特定のコンピュータでかかった「何秒」という経過時間とは別の概念です。経過時間はハードウェア・言語・実装によって変わりますが、実行回数の増え方はアルゴリズムそのものの性質です。
次の三つの水準を区別します。
| 水準 | 意味 | 例 |
|---|---|---|
| 正確な回数 | 決められた文が実行される正確な回数 | n(n + 1)/2 |
| Θ(シータ) | 定数倍を無視したぴったりの増加率(上下とも) | Θ(n²) |
| O(ビッグオー) | 定数倍を無視した上界(これより速くは増えない) | O(n²)。O(n³) も正しいが緩い上界 |
試験で「計算量は O(…)」という場合、ふつうは最もきつい上界を指すことが多いですが、定義上 O は上界であることを覚えておきましょう。
例題4:三角形の二重ループの正確な回数
count ← 0
for i ← 1 to n
for j ← 1 to i
count ← count + 1
output count
数え方の規則: count ← count + 1 が実行される回数を数える(=最終的な count の値)。
n = 4 のとき、行の意味は「外側の繰返し i 回目の内側の繰返しがすべて終わった直後」。
| i | 内側の j の値 | 今回の実行回数 | 累計 count |
|---|---|---|---|
| 1 | 1 | 1 | 1 |
| 2 | 1, 2 | 2 | 3 |
| 3 | 1, 2, 3 | 3 | 6 |
| 4 | 1, 2, 3, 4 | 4 | 10 |
- 一般式:1 + 2 + … + n = n(n + 1)/2。n = 4 なら 4×5/2 = 10。
- n(n + 1)/2 = n²/2 + n/2 から最高次の項だけを残し、定数倍を捨てると Θ(n²)、したがって O(n²)。
計算の規則のまとめ
- 順次のブロックは足す: ブロックAの後にブロックBなら、回数は A + B、増加率は大きい方。例:n + n² → Θ(n²)。
- 独立した二重ループは掛ける: 外側 n 回 × 内側 m 回(内側の範囲が外側の変数に依存しない)→ n·m 回。
- 半分/2倍のループは対数: 毎回
j ← 2 * j(またはn ← n div 2)を行う繰返しは約 log₂ n 回 → Θ(log n)。 - 分岐: 正確な回数は実際に実行された経路で数えます。最悪計算量(ビッグオー)は最もコストの大きい分岐を基準にします。
- 領域計算量: 入力以外に追加で使うメモリ(補助領域)を見ます。例題4は
count,i,jしか使わないので Θ(1)。再帰では呼出しスタックも領域です。例題3の F(n) は Θ(n) のスタック領域を使います。
8. 状態遷移
「状態」という言葉には二つの意味があります。
- アルゴリズムの変数の状態: ある時点でのすべての変数の値の組。例:例題2の (a, b) = (18, 12)。
- 有限状態機械(有限オートマトン)の状態: あらかじめ決められた有限個の状態のうちの一つ。例:「偶数(E)」「奇数(O)」。
有限状態機械における遷移とは、「現在の状態と入力記号が決まると次の状態が決まること」です。この規則を表にしたものが状態遷移表、円と矢印で描いたものが状態遷移図です。
例題5:パリティ(1の個数が偶数か)オートマトン
- 状態:E(これまでに読んだ1の個数が偶数)、O(奇数)。開始状態は E。
- 規則:入力0 → 状態はそのまま、入力1 → E と O を入れ替える。
状態遷移表
| 現在の状態 | 入力0 | 入力1 |
|---|---|---|
| E | E | O |
| O | O | E |
状態遷移図(テキスト表現)
(開始) → E
E --0--> E E --1--> O
O --0--> O O --1--> E
入力 101101 のトレース。 行の意味:k番目の記号を読む前の状態と読んだ後の状態の両方を書く。
| k | 読む前の状態 | 入力記号 | 読んだ後の状態 |
|---|---|---|---|
| 1 | E | 1 | O |
| 2 | O | 0 | O |
| 3 | O | 1 | E |
| 4 | E | 1 | O |
| 5 | O | 0 | O |
| 6 | O | 1 | E |
- 状態列:E → O → O → E → O → O → E。
- 最終状態 E は、入力に含まれる1の個数(4個)が偶数パリティであることを意味します。
- 落とし穴:「読む前」の列だけを並べて答えると、最後の記号の効果が抜けて E, O, O, E, O, O になります。問題で行が何を意味するかを必ず確認してください。
9. オリジナル練習問題(5問)
以下の5問はすべて本記事のために新しく作成したオリジナル問題であり、過去問題を使用したり改変したりしていません。表記は第3節の本記事専用の表記に従います。
問題1(変数のトレース)
次の擬似言語を実行したとき、出力される b の値はどれか。(チェックポイント:繰返し本体の3文をすべて実行した直後)
a ← 3
b ← 0
k ← 1
while k ≤ 3
b ← b + a * k
a ← a − 1
k ← k + 1
output b
- 7
- 18
- 10
- 4
正解:3(10)
トレース表(実行後の a, b, k):
| 行 | 判定 | 計算 | a | b | k |
|---|---|---|---|---|---|
| 初期 | — | — | 3 | 0 | 1 |
| 繰返し1 | 1 ≤ 3 真 | b = 0 + 3×1 = 3 | 2 | 3 | 2 |
| 繰返し2 | 2 ≤ 3 真 | b = 3 + 2×2 = 7 | 1 | 7 | 3 |
| 繰返し3 | 3 ≤ 3 真 | b = 7 + 1×3 = 10 | 0 | 10 | 4 |
| 終了 | 4 ≤ 3 偽 | — | — | — | — |
- 選択肢1(7):繰返し2の直後の値です。
≤を<と読み、2回だけ実行するとこの値になります。 - 選択肢2(18):
aが減ることを無視して 3×1 + 3×2 + 3×3 を計算した値です。 - 選択肢3(10):正解。各文を順番に、その時点の値で計算した結果です。
- 選択肢4(4):
a ← a − 1をbの更新より先に実行したと思い込んだ値です(2×1 + 1×2 + 0×3 = 4)。
問題2(繰返しの終了・1ずれ)
n は1以上の整数である。本体 P をちょうど n 回実行し、各実行の開始時の i の値が 0, 1, …, n − 1 になるようにしたい。正しいものはどれか。
i ← 0/while i ≤ n/ (本体)P,i ← i + 1i ← 0/while i < n/ (本体)P,i ← i + 1i ← 1/while i < n/ (本体)P,i ← i + 1i ← 0/while i = n/ (本体)P,i ← i + 1
正解:2
- 選択肢1:
iが 0, 1, …, n のときに実行され、n + 1 回になります(1回多い)。 - 選択肢2:正解。
iが0から n − 1 の間は条件が真で、i = nで偽になるので、ちょうど n 回です。毎回iが1ずつ増えてn − iが減るので、必ず終了します。 - 選択肢3:
iが 1, …, n − 1 なので n − 1 回で、開始値も0ではありません(1回少ない)。 - 選択肢4:終了条件(
i = n)を継続条件の位置に書いた誤りです。最初はi = 0 ≠ n(n ≥ 1)なので条件が偽となり、0回しか実行されません。
問題3(再帰の戻りのトレース)
G(n):
if n = 0
return 0
else
return 2 * G(n − 1) + 1
G(3) を呼び出したとき、各呼出しが戻る順に戻り値を並べたものはどれか。
- 7, 3, 1, 0
- 0, 1, 2, 3
- 1, 3, 7, 15
- 0, 1, 3, 7
正解:4
呼出しの順序:G(3) → G(2) → G(1) → G(0)。戻りの順序:G(0), G(1), G(2), G(3)。
| 戻りの段階 | 呼出し | 計算 | 戻り値 |
|---|---|---|---|
| 1 | G(0) | 基底部 | 0 |
| 2 | G(1) | 2×0 + 1 | 1 |
| 3 | G(2) | 2×1 + 1 | 3 |
| 4 | G(3) | 2×3 + 1 | 7 |
- 選択肢1:値は正しいものの、呼出しの順序(G(3) から)で並べています。戻りは最も深い呼出しから起こります。
- 選択肢2:戻り値ではなく、各呼出しの引数 n を戻りの順に並べたものです。
- 選択肢3:基底部の値を1と勘違いし、値が1段ずつずれたものです(G(0)=1 なら 1, 3, 7, 15)。
- 選択肢4:正解。
問題4(演算回数・ビッグオー)
count ← 0
for i ← 1 to n
count ← count + 1
for i ← 1 to n
j ← 1
while j < n
count ← count + 1
j ← 2 * j
output count
数え方の規則: count ← count + 1 の実行回数(=出力値)。n = 8 のときの出力値と、n が2のべき乗のときの時間計算量の組合せとして正しいものはどれか。
- 32, Θ(n log n)
- 40, Θ(n log n)
- 24, Θ(n log n)
- 72, Θ(n²)
正解:1
- 1番目のループ:8回。
- 2番目のループ:各 i について、内側の
whileは j = 1, 2, 4 のときに実行(j = 8 では8 < 8が偽)→ 3回 = log₂ 8。8 × 3 = 24回。 - 合計 8 + 24 = 32。一般には n + n·log₂ n で、順次のブロックは大きい方が支配するので Θ(n log n)。
- 選択肢1:正解。
- 選択肢2(40):内側の条件を
j ≤ nと読み、各 i について4回と数えた1ずれです(8 + 8×4)。 - 選択肢3(24):1番目の順次ブロック(8回)を足していません。
- 選択肢4(72, Θ(n²)):内側のループを n 回の繰返しと勘違いしています(8 + 8×8)。2倍ずつ増えるループは対数回です。
問題5(状態遷移)
次の状態遷移表を持つオートマトンがある。開始状態は R0 である。
| 現在の状態 | 入力0 | 入力1 |
|---|---|---|
| R0 | R0 | R1 |
| R1 | R2 | R0 |
| R2 | R1 | R2 |
入力 1101 を左から1記号ずつ読むとき、各記号を読んだ直後の状態を順に並べたものはどれか。
- R1, R2, R2, R2
- R0, R1, R0, R0
- R1, R0, R0, R1
- R1, R2, R2, R0
正解:3
| k | 読む前 | 入力 | 読んだ後 |
|---|---|---|---|
| 1 | R0 | 1 | R1 |
| 2 | R1 | 1 | R0 |
| 3 | R0 | 0 | R0 |
| 4 | R0 | 1 | R1 |
- 選択肢1:入力を右から(1, 0, 1, 1)読んだ結果です(R0→R1→R2→R2→R2)。
- 選択肢2:各記号を読む前の状態を並べています。最後の記号の効果が抜けます。
- 選択肢3:正解。最終状態は R1。(参考:この表は2進数を左から読みながら3で割った余りを追跡する機械で、1101₂ = 13、13 mod 3 = 1 と一致します。)
- 選択肢4:表を見ずに「1の個数を3で割った余り」を数える機械だと推測した結果です(R1 で1を読むと表では R0 なのに、R2 として処理)。
10. クイックシート
←は代入、=は比較。問題文の記号の定義が常に優先。- トレース表:初期行 → チェックポイントの定義 → 1文ずつ → 古い値/新しい値の区別 → 出力と最終状態。
while 条件は継続条件。終了条件はその否定。- 繰返しの点検3点:初期化・条件・更新。変量が真に減少し、下限があれば終了する。
- 再帰:呼出しは降りながら積み重なり、戻りは逆順にほどける。基底部への進行が必須。呼出しごとに独立した変数。
- F(n) = n + F(n − 2):呼出し回数・スタックの深さは Θ(n)。
- 1 + 2 + … + n = n(n + 1)/2 → Θ(n²)。
- 順次は足し算、独立した入れ子は掛け算、半分/2倍は log。
- 正確な回数 ≠ Θ(ぴったりの増加率)≠ O(上界)≠ 秒単位の経過時間。
- 有限状態機械:次の状態 = f(現在の状態, 入力)。行が「読む前」か「読んだ後」かを確認する。
11. よくある落とし穴
- 同じ繰返しの中ですでに更新された値を古い値と取り違える(またはその逆)。
<と≤を混同して1回ずれる。- 終了条件をそのまま
whileの後ろに書く。 - 更新の文を書き忘れて無限ループになる。
- 再帰の戻りの順序を呼出しの順序で答える。
- 基底部の戻り値を読み違えて、すべての値がずれる。
- 定数倍や低次の項を残したまま Θ/O を書く(例:Θ(n²/2))。
- 2倍ずつ増えるループを n 回と数える。
- 再帰のスタック領域を領域計算量から落とす。
- 状態遷移のトレースで、入力を読む方向や行の時点を取り違える。
12. 最終セルフチェック
- 例題1を見ずに、(x, total) の4行と出力15を作り直せる。
- 48 mod 18、18 mod 12、12 mod 6 を計算し、繰返し3回・結果6を説明できる。
- F(5) の呼出しの順序と戻りの順序(戻り値 1, 4, 9)を別々に書ける。
- 三角形の二重ループの n(n + 1)/2 と、n = 4 のときの10を表で示せる。
- 正確な回数、Θ、O、補助領域の違いをそれぞれ一文で説明できる。
- パリティオートマトンで
101101の状態列 E→O→O→E→O→O→E を再現できる。 - 練習問題5問の誤りの選択肢がなぜ誤りかを説明できる。
13. 復習の提案(1日/3日/7日)
学習データに基づく処方ではなく、一般的な間隔をあけた復習の提案です。
- 1日後: クイックシートを読み、例題1・2のトレース表を白紙に書き直す。
- 3日後: 例題3・4を解き直し、n = 5 に変えて三角形ループの回数(15)と F(7)(= 7 + 5 + 3 + 1 = 16)を自分で確かめる。
- 7日後: 練習問題5問を解説を見ずに解き直し、間違えた問題の落とし穴を第11節で探して印を付ける。
14. シラバスとの対応
- 大分類1:基礎理論/中分類1:基礎理論/3. 情報に関する理論/(6)オートマトン
- 大分類1:基礎理論/中分類1:基礎理論/3. 情報に関する理論/(8)計算量
- 大分類1:基礎理論/中分類2:アルゴリズムとプログラミング/2. アルゴリズム/(1)流れ図
- 大分類1:基礎理論/中分類2:アルゴリズムとプログラミング/2. アルゴリズム/(2)代表的なアルゴリズム/②再帰のアルゴリズム
- 大分類1:基礎理論/中分類2:アルゴリズムとプログラミング/2. アルゴリズム/(3)アルゴリズム設計
15. 出典
- IPA「応用情報技術者試験(レベル3)シラバス Ver.7.2」 https://www.ipa.go.jp/shiken/syllabus/omgdg50000005kq5-att/syllabus_ap_ver7_2.pdf (確認日:2026-10-20/本記事の改訂日:2026-10-20)
- シラバスは出題範囲の確認にだけ使用しました。本記事の解説・例題・練習問題はすべて独自に作成したもので、過去問題や第三者の解説は使用していません。本記事はIPAの承認や保証を受けた資料ではありません。