Keep your place in this quest

Log in or sign up for free to subscribe, follow lesson progress, and access more learning content.

再帰とは、関数が自分自身を呼び出すことで問題を解決する特別なプログラミング手法です。
最初はちょっと魔法みたいに感じたり、少し奇妙に思えるかもしれませんが、理解すると非常に強力なツールです。

これは向かい合った二つの鏡を見るようなものだと考えてください。鏡の中に鏡の反射が映り込み、それがどんどん続いていきます…最終的にそれが徐々に消えていくのです。再帰ではその「消えていく」部分が非常に重要で、これを基本ケース(ベースケース)と呼び、繰り返しを止める役割を果たします。

再帰の仕組み

再帰関数は:

  1. 停止すべきかを判断する — これが基本ケースです。
  2. 停止すべきでなければ、自分自身を呼び出しますが、その問題は元の問題より小さく、単純なものになります。

問題を繰り返し小さく分割することで、再帰は最も単純な問題にたどり着き、それを解決し、すべての呼び出しから戻る際に答えを組み立て直します。

例:階乗の計算

数字の階乗(factorial)を考えてみましょう。
数学では、nの階乗(n!と書く)は次の意味です:

n! = n × (n-1) × (n-2) × ... × 1

例えば:

5! = 5 × 4 × 3 × 2 × 1 = 120

これがPythonでの再帰バージョンです:

def factorial(n):
    if n == 0:  # 基本ケース
        return 1
    return n * factorial(n - 1)

print(factorial(5))  # 120

ここで起こっていること:

  • nが0の場合は基本ケースに達しています — 定義上、0!は1です。
  • そうでなければ、nに対してfactorial(n - 1)(同じ問題のより小さいバージョン)を掛け合わせます。
  • これを基本ケースに達するまで繰り返します。

なぜ再帰を使うのか?

再帰は:

  • 構造が自然に繰り返している問題に対してエレガントで簡潔になりやすい。
  • 数学的な問題(階乗やフィボナッチ数など)に最適です。
  • ツリー構造のデータ探索(ファイルシステム、家系図、ゲームAI探索など)に欠かせません。

時にはループを置き換えることもできますが、必ずしも最も効率的な選択肢ではありません。

ヒント:再帰は「問題をより小さな問題に分割し続け、直接解けるまで繰り返す」と考えると理解しやすいです。

よくある落とし穴

重要!:必ず基本ケースを定義してください — これがなければ関数は無限に自身を呼び続け、PythonはRecursionErrorを投げます。

トラブルシューティング:

  • “RecursionError: maximum recursion depth exceeded”(最大再帰深度を超えました)→ 基本ケースに到達していない、または基本ケースの定義が誤っています。
  • 再帰が問題に対して複雑すぎると感じたら、ループを試してみてください。

再帰は最初は難解に思えるかもしれませんが、コードを賢く柔軟にする一つの方法です。いくつか練習問題で試してみれば、その強力さだけでなく、驚くほど短くエレガントなコードを書けることにも気づくでしょう。