では「再帰を使うときの思考手順(設計のコツ)」を整理してみましょう。
再帰は「魔法」ではなく、実はシンプルな設計パターンに従って書くだけなんです。
再帰設計の4ステップ
1. 問題を「同じ形に分割できるか」考える
- 例: 配列の合計 → 「先頭の要素 + 残りの配列の合計」
- 例: 文字列の反転 → 「残りの文字列を反転 + 先頭の文字」
👉 「小さくした問題」も元の問題と同じ形になっていることが大事。
2. 終了条件(ベースケース)を決める
- どこで止めるかを最初に決める。
- 例: 配列が空になったら0を返す
- 例: nが0になったら1を返す
👉 これがないと無限ループになる。
3. 再帰ステップを書く
- 問題を「1歩だけ小さく」して同じ関数を呼ぶ。
- 例:
factorial(n) = n * factorial(n-1) - 例:
sumArray(arr) = arr[0] + sumArray(arr.slice(1))
4. 戻り値をどう組み立てるか考える
- 再帰呼び出しから返ってきた値をどう使うか。
- 例: 掛け算する、足し算する、文字をつなげる、配列を結合する。
設計のコツを例で確認
例: 文字列の反転
- 分割: 「先頭 + 残り」
- 終了条件: 空文字なら “” を返す
- 再帰ステップ: 残りを反転する
- 戻り値の組み立て:
reverse(残り) + 先頭
function reverse(str) {
if (str === "") return "";
return reverse(str.slice(1)) + str[0];
}
JavaScriptまとめ
- 再帰は「問題を小さく分ける」+「終了条件」+「戻りながら組み立てる」の3点セット。
- 書くときは 終了条件を先に決める と迷いにくい。
- ループで書けるものも多いけど、入れ子構造や分割統治では再帰が圧倒的にシンプル。
