それでは「ファイルシステム探索」を題材にして、再帰版とループ版を比較してみましょう。実際の開発でも「ディレクトリの中身を全部調べる」「特定のファイルを探す」といった処理はよく出てきます。
再帰版(直感的)
const fs = require("fs");
const path = require("path");
function walkDir(dir) {
const files = fs.readdirSync(dir);
for (const file of files) {
const fullPath = path.join(dir, file);
const stat = fs.statSync(fullPath);
if (stat.isDirectory()) {
walkDir(fullPath); // 再帰で潜る
} else {
console.log(fullPath);
}
}
}
walkDir("./test"); // 例: ./test ディレクトリを探索
HTML👉 「ディレクトリならもう一度呼ぶ」というルールだけでシンプルに書ける。
ループ版(スタックを自分で管理)
const fs = require("fs");
const path = require("path");
function walkDirLoop(root) {
const stack = [root];
while (stack.length > 0) {
const dir = stack.pop();
const files = fs.readdirSync(dir);
for (const file of files) {
const fullPath = path.join(dir, file);
const stat = fs.statSync(fullPath);
if (stat.isDirectory()) {
stack.push(fullPath); // 自分でスタックに積む
} else {
console.log(fullPath);
}
}
}
}
walkDirLoop("./test");
HTML👉 再帰を使わない場合は「自分でスタックを持って管理」する必要がある。
✅ 比較まとめ
| 観点 | 再帰版 | ループ版 |
|---|---|---|
| コード量 | 短い | 長い |
| 可読性 | ツリー構造を直感的に表現 | スタック管理が必要で複雑 |
| 柔軟性 | 子がある限り自然に潜れる | 自分で「積む/取り出す」を制御 |
| 安全性 | 深すぎるとスタックオーバーフロー | 安定して大量データも処理可能 |
結論
- 再帰版 → 「構造をそのまま表現」できるので読みやすい。
- ループ版 → 「大量の階層」でも安全に処理できる。
👉 ここまでで「ファイルシステム探索」を通じて、再帰とループの実務的な違いを体感できました。
次は「再帰を使ったアルゴリズム設計の思考法(どうやって再帰的に分解するか)」を整理してみると、さらに応用力がつきます。


