擬似コード頻出パターン
まず結論
科目Bの擬似コードには最大値・合計・カウント・探索・ソート・再帰という頻出パターンがあります。これらのパターンを「型」として身につけることで、初見の問題も素早く理解できるようになります。
頻出パターンの「型」まとめ
最大値の型
max ← a[1]
i を 2〜n
if a[i] > max
max ← a[i]
i を 2〜n
if a[i] > max
max ← a[i]
初期化→比較→更新
合計の型
sum ← 0
i を 1〜n
sum ← sum + a[i]
i を 1〜n
sum ← sum + a[i]
0で初期化が必須
カウントの型
cnt ← 0
i を 1〜n
if 条件
cnt ← cnt+1
i を 1〜n
if 条件
cnt ← cnt+1
条件成立で+1
再帰の型
手続き f(n)
if n≦1: n を返す
f(n-1)+f(n-2)を返す
if n≦1: n を返す
f(n-1)+f(n-2)を返す
基底条件が必須
スタック逆順の型
i を 1〜len
push(s[i])
stack空でない間
pop()を表示
push(s[i])
stack空でない間
pop()を表示
LIFO→逆順出力
2次元配列の型
i を 1〜rows
j を 1〜cols
sum←sum+a[i][j]
j を 1〜cols
sum←sum+a[i][j]
外ループ=行、内=列
パターン1:最大値・最小値の取得
// 配列から最大値のインデックスを求める
a ← {7, 2, 9, 4, 6}
maxIdx ← 1
i を 2 から 5 まで繰り返す
もし a[i] > a[maxIdx] ならば
maxIdx ← i
もし終わり
繰り返し終わり
maxIdx を返す // → 3(a[3]=9が最大)
最大値パターンの型:① 最初の要素で初期化 → ② ループで全て比較 → ③ より大きければ更新。最小値は「>」を「<」に変えるだけ。
パターン2:再帰処理(フィボナッチ数列)
// n番目のフィボナッチ数を返す再帰関数
手続き fib(n)
もし n ≦ 1 ならば
n を返す // 基底条件:f(0)=0, f(1)=1
もし終わり
fib(n-1) + fib(n-2) を返す
手続き終わり
| 呼び出し | 実行内容 | 戻り値 |
|---|---|---|
| fib(4) | fib(3) + fib(2)を計算 | 3 |
| fib(3) | fib(2) + fib(1)を計算 | 2 |
| fib(2) | fib(1) + fib(0)を計算 | 1 |
| fib(1) | 基底条件:n≦1 | 1 |
| fib(0) | 基底条件:n≦1 | 0 |
再帰の2大要素:① 基底条件(Base Case):無限に続かないようにする停止条件 → ② 再帰呼び出し:自分より小さい問題に分解して呼ぶ
パターン3:スタックを使った処理
// スタックを使って文字列を逆順にする
s ← "HELLO"
stack ← 空のスタック
// 全文字をプッシュ
i を 1 から s の長さ まで繰り返す
push(stack, s[i])
繰り返し終わり
// 全文字をポップして表示
stack が空でない間, 繰り返す
pop(stack) を表示する
繰り返し終わり
// → OLLEH(逆順)
スタック(LIFO)の応用:「逆順」「括弧の対応チェック」「深さ優先探索」など。後から入れたものを最初に取り出す性質を活かした問題が出題される。
パターン4:2次元配列の処理
// 3×3行列の全要素の合計を求める
a ← {{1,2,3},{4,5,6},{7,8,9}}
goukei ← 0
i を 1 から 3 まで繰り返す // 行
j を 1 から 3 まで繰り返す // 列
goukei ← goukei + a[i][j]
繰り返し終わり
繰り返し終わり
goukei を返す // → 45(1〜9の合計)
2次元配列の読み方:a[行][列]または a[i][j]の記法。i=行番号、j=列番号。2重ループで全要素をなめる。
🎯 パターン別頻出テーマ
- 最大値・最小値:初期化の値と比較方向を確認する
- 再帰:基底条件(終了条件)を必ず確認。スタックトレースで追う
- スタック:LIFO(後入れ先出し)。push/popの順序が逆順になる
- キュー:FIFO(先入れ先出し)。enqueue/dequeueで元の順序を維持
⚠️ よくある間違い
- 「再帰の基底条件を見落とす」→ ✗ 基底条件がないと無限ループになる。必ず確認する
- 「配列インデックスのずれ(0始まりか1始まりか)」→ 問題文のコードを確認。a[1]から始まるのかa[0]から始まるのか
- 「二重ループで内ループと外ループを混同する」→ iが行(外)、jが列(内)が多いが、問題によって異なるので確認
✍️ 確認クイズ
Q1. 再帰関数で「基底条件(Base Case)」が必要な理由はどれか。
✅ 正解は②。基底条件は再帰の「出口」。これがないと再帰が終わらず無限に続いてしまいます。例:fib(n)でn≦1のとき直接nを返す → これが基底条件でこれ以上再帰しない。
Q2. スタックにA, B, Cの順でプッシュして、3回ポップした結果はどれか。
✅ 正解は②。スタックはLIFO(Last In First Out)。A→B→Cの順でプッシュすると取り出しはC→B→Aの逆順になります。
Q3. 最大値を求めるアルゴリズムで、最初の要素で変数maxを初期化する理由はどれか。
✅ 正解は②。max←0で初期化すると全要素が負の場合(例:{-5,-3,-1})、常にmax=0になって正しい最大値-1が求まらない。最初の要素a[1]で初期化すれば全要素が負でも正しく動作します。
Q4. 配列 a[1..5] = {3, 1, 4, 1, 5} の合計を求めるとき、合計変数 sum の正しい初期値はどれか。
✅ 正解は②。合計を求めるアルゴリズムでは sum ← 0 で初期化します(足し算の単位元が0のため)。ループで全要素を足した結果 3+1+4+1+5=14 が得られます。最大値を求めるときは最初の要素で初期化しますが、合計は必ず0で初期化します。
Q5. 配列の要素数を数える(カウント)アルゴリズムで、条件に合う要素のカウンタ変数 cnt の正しい初期値と更新方法はどれか。
✅ 正解は②。カウントアルゴリズムは cnt ← 0 で初期化し、条件に合う要素を見つけるたびに cnt ← cnt + 1(インクリメント)します。これは基本パターンで、合計も cnt の更新を cnt ← cnt + a[i] にするだけで合計アルゴリズムになります。
Sponsor Link