【さいき】

再帰 とは?

💡 鏡の中にまた鏡がある「自分自身を呼ぶ」仕組み
📌 このページのポイント
再帰:自分自身を呼び出す 呼び出し(スタック積み) factorial(4) factorial(3) factorial(2) factorial(1) = 1 ↑ 基底条件(再帰終了) 戻り値(スタック巻き戻し) return 1 {'return 2×1 = 2'} {'return 3×2 = 6'} {'return 4×6 = 24'}
再帰処理の仕組み
ひよこ ひよこ

再帰って何が便利なの?

ペンギン先生 ペンギン先生

繰り返す構造をシンプルに書けるんだ。例えばフォルダの中にフォルダがあって、その中にもまたフォルダが…という構造を処理するとき、再帰を使うとすっきり書ける。

ひよこ ひよこ

うーん、でも自分を呼び続けたら止まらなくなりそう

ペンギン先生 ペンギン先生

そう、だから「ベースケース」が必須なんだ。「ここで止める」という条件を必ず書く。例えばフィボナッチ数列なら「n が 0 か 1 なら n を返す」という終了条件を最初に書く。

ひよこ ひよこ
ペンギン先生 ペンギン先生

再帰呼び出しは毎回スタックに積まれるんだ。深く呼び続けるとメモリが足りなくなって強制終了する。それがスタックオーバーフロー。深い再帰が必要なときは「末尾再帰最適化」という技法や、ループへの書き直しを検討する。

ひよこ ひよこ

末尾再帰最適化って何が違うの?

ペンギン先生 ペンギン先生

関数の最後の操作が再帰呼び出しだけのとき、一部の言語はスタックを積まずに同じフレームを使い回す最適化ができる。JavaScriptは仕様上サポートしているけど実装している処理系はほぼなくて、Haskellや関数型言語では当たり前に機能する。「末尾」に再帰が来るかどうかで、スタック消費がまったく変わってくるんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
再帰って出てきたら「関数が自分自身を呼んで繰り返す」と思えばだいたいOK!
📖 おまけ:英語の意味
「Recursion」 = 再帰・繰り返し戻ること
💬 ラテン語の「recurrere(再び走る)」が語源。プログラミングでは「自分自身を再び呼ぶ」という意味で使われる
← 用語集にもどる