それでは「再帰を使った探索アルゴリズム」を図解で追ってみましょう。ここでは分かりやすい例として 迷路探索(深さ優先探索) を取り上げます。
問題設定
- 迷路を2次元配列で表す
0= 通れる道1= 壁S= スタートG= ゴール
例:
S 0 1
1 0 0
1 1 G
再帰的な探索の考え方
- 現在地がゴールなら成功
- 壁や範囲外なら失敗
- 上下左右に1歩進んで再帰的に探索
- どこかで成功したら true を返す
コード例(イメージ)
function searchMaze(maze, x, y) {
// 範囲外や壁なら失敗
if (x < 0 || y < 0 || x >= maze.length || y >= maze[0].length) return false;
if (maze[x][y] === 1) return false;
// ゴールなら成功
if (maze[x][y] === "G") return true;
// 通った場所を「壁」にして再訪を防ぐ
maze[x][y] = 1;
// 上下左右を探索
return searchMaze(maze, x+1, y) ||
searchMaze(maze, x-1, y) ||
searchMaze(maze, x, y+1) ||
searchMaze(maze, x, y-1);
}
JavaScript実行の流れ(図解)
スタート S から探索を始めると:
S → 右へ進む → 下へ進む → ゴールGに到達!
再帰の動きはこうなります:
searchMaze(S)
→ ゴールじゃないので上下左右を試す- 右に進む →
searchMaze(0,1)
→ さらに下に進む →searchMaze(1,1)
→ さらに右に進む →searchMaze(1,2)
→ 下に進む →searchMaze(2,2)= ゴール!
ポイント
- 再帰は「分岐がある探索」に強い
- ループで書くと「スタック」や「キュー」を自分で管理する必要があるが、再帰なら「関数呼び出しの積み重ね」がそのまま探索の流れになる
- 木構造や迷路探索など「どんどん潜っていって、戻りながら答えを探す」処理に最適
👉 ここまでで「再帰の基礎 → 配列処理 → ネスト構造 → 探索アルゴリズム」とステップアップしてきました。


