再帰とは(全体像)
再帰とは、ある処理(関数)が、その中で「自分自身」を呼び出す手法のことだ。同じ処理を、対象を少しずつ小さくしながら、くり返していく。
合わせ鏡(鏡が鏡を映す)をイメージすると分かりやすい。ただし、どこかで止めないと、永遠に続いてしまう。
ここで一番のポイント。再帰には、「終了条件」が必須だ。「ここまで来たら止まる」という条件を必ず用意する。これがないと、自分を呼び続けて止まらなくなり(無限ループ)、メモリがあふれてしまう(スタックオーバーフロー)。「再帰に終了条件は要らない」と思い込むと誤りになる。
詳しく:終了条件と、反復との使い分け
ここが心臓部。再帰のポイントを押さえよう。
再帰のポイント
| 項目 | やさしい意味 |
|---|---|
| 再帰呼出 | 処理が、自分自身を呼び出す |
| 終了条件 | ここで止まる、という条件(必須) |
| 用途 | 階乗・フィボナッチ・ツリー探索・分割統治(クイック/マージソート)など |
| 反復との使い分け | 再帰が常によいとは限らない(ループが効率的なことも) |
再帰は、「終了条件」と「再帰呼出(自分を呼ぶ)」の2つで成り立つ。終了条件で止まり、それまでは自分を呼び続ける。
そして、もう1つ大事なこと。再帰が、いつも反復(ループ)より優れているわけではない。すっきり書ける場面もあるが、深い再帰はメモリを多く使うので、ループのほうが効率的なこともある。「再帰は、いつもループより優れている」と思い込むと誤りだ。場面によって使い分けよう。
わかりやすく言い換えると
身近なたとえで整理しよう。
再帰は、「合わせ鏡のように、自分自身を呼び出してくり返すこと」のイメージ。同じことを、少しずつ小さくしながらくり返す。
「終了条件が必須」というのは、どこかで止める合図がいること。要するに、止まる条件がないと、永遠に続いてしまう。
「反復との使い分け」は、再帰が向く場面もあれば、ループが向く場面もあること。つまり、どちらが常に優れている、というわけではない。
試験のツボ
🔴 一番出る:再帰の正体
①処理(関数)が、自分自身を呼び出す手法
②同じ処理を、少しずつ小さくしながらくり返す
🔴 次に出る:終了条件が必須
①「ここで止まる」という終了条件が必須
②ないと、止まらなくなる(無限ループ・スタックオーバーフロー)
🟡 押さえると安定:反復との使い分け
①再帰が常によいとは限らない
②深い再帰はメモリを多く使う。ループが効率的なことも
よくある間違い
①「再帰には、終了条件は必要ない」→ ✗ 終了条件は必須。ないと、自分を呼び続けて止まらなくなる。
②「再帰は、つねに反復(ループ)より優れている」→ ✗ 場面次第。深い再帰はメモリを多く使い、ループが効率的なこともある。
③「再帰とは、別の関数を1回だけ呼び出すことだ」→ ✗ 再帰は、自分自身を呼び出す手法。別の関数を1回呼ぶこととは違う。
試験での出題パターン
実際の問題でたしかめてみよう。
オリジナル問題1(再帰の正体)
再帰に関する次の記述のうち、最も適切なものはどれか。
- 社員の出退勤を記録して、毎月の給与を計算するためのしくみである
- 取引先へ毎月の請求書を郵送する、決まった事務作業のことを指す
- 処理(関数)が、その中で、自分自身を呼び出していく手法である
- 完成したシステムを宣伝して、より多く売るための広告活動である
解答は 3 だぱん。
再帰は、処理(関数)が、自分自身を呼び出す手法なんだぱん。合わせ鏡のように、同じことをくり返すイメージだぱん。
選択肢1は給与計算、選択肢2は請求書の事務、選択肢4は広告で、どれも違うぱん。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 給与計算のしくみではない |
| 2 | ✗ | 請求書の事務の話 |
| 3 | ✓ | 自分自身を呼び出す手法で正しい |
| 4 | ✗ | 広告活動ではない |
オリジナル問題2(終了条件)
再帰の終了条件に関する次の記述のうち、最も適切なものはどれか。
- 終了条件は必須で、ないと止まらなくなるのだ(無限ループ)
- 終了条件は必要なく、なくても問題ないとされているものだ
- 社員の給与を計算するときだけ、終了条件がいるとされている
- 取引先へ請求書を郵送するときだけ、終了条件がいるとされる
解答は 1 だぱん。
再帰の終了条件は、必須で、ないと止まらなくなる(無限ループ)んだぱん。「ここで止まる」という合図が必要だぱん。
選択肢2の「必要ない」、選択肢3の給与、選択肢4の請求書は、いずれも違うぱん。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✓ | 終了条件は必須で正しい |
| 2 | ✗ | 終了条件は必須 |
| 3 | ✗ | 給与計算のときだけではない |
| 4 | ✗ | 請求書のときだけではない |
オリジナル問題3(反復との使い分け)
再帰と反復(ループ)の関係に関する次の記述のうち、最も適切なものはどれか。
- 再帰は、どんなときも必ず反復より優れているとされている
- 場面次第で、再帰が向くときも、ループが向くときもあるのだ
- 社員の給与を計算するときだけ、再帰を使うとされているものだ
- 取引先へ請求書を郵送するときだけ、再帰を使うとされている
解答は 2 だぱん。
再帰と反復は、場面次第で、再帰が向くときも、ループが向くときもあるんだぱん。再帰が常に優れているわけではないんだぱん。
選択肢1の「必ず優れている」、選択肢3の給与、選択肢4の請求書は、いずれも違うぱん。
| 選択肢 | 判定 | 理由 |
|---|---|---|
| 1 | ✗ | 常に優れているとは限らない |
| 2 | ✓ | 場面次第で使い分けるで正しい |
| 3 | ✗ | 給与計算のときだけではない |
| 4 | ✗ | 請求書のときだけではない |
まとめ
押さえどころ
- 🔴 再帰 = 処理(関数)が、自分自身を呼び出す手法。同じ処理を少しずつ小さくくり返す。
- 🔴 終了条件が必須 = 「ここで止まる」条件がないと、止まらなくなる(無限ループ・スタックオーバーフロー)。
- 🟡 反復との使い分け = 再帰が常によいとは限らない。深い再帰はメモリを多く使い、ループが効率的なことも。
次に学ぶ
- クイックソート ── 分けてくり返す並べ替え。再帰(分割統治)の代表的な使い道。
- 反復(ループ) ── くり返しの処理。再帰と、場面によって使い分ける。
執筆: SikakuQuest編集部