🇯🇵 日本語 | 🇺🇸 English

第32回 再帰関数

「自分自身を呼び出す関数」の仕組みを、コールスタックの可視化で理解しましょう。

📖 このページで覚えること
✅ 最低限ここだけ覚える
  • 再帰は「関数が自分自身を呼び出す」書き方
  • 必ずベースケース(終了条件)を書く
  • 呼び出しはコールスタックに積まれ、戻りながら計算される
⭐ 余裕があれば読む
  • 階乗とフィボナッチで再帰の形を比較する
  • 無限再帰とスタックオーバーフローの原因を理解する
  • 再帰が向く問題とループで十分な問題を見分ける

再帰とは

再帰(recursion)とは、関数が自分自身を呼び出すプログラミング手法です。
ループで書ける処理も再帰で書けますが、問題の構造を分割して考えるときに特に威力を発揮します。
再帰には必ずベースケース(終了条件)が必要です。これがないと無限に呼び出しが続き、スタックオーバーフローになります。

階乗(factorial)

n! = n × (n-1) × ... × 1 を再帰で書くと、こうなります。
int factorial(int n) {
    if (n <= 1) return 1;   // ベースケース
    return n * factorial(n - 1); // 再帰呼び出し
}
動作の流れ(n=4の場合):
factorial(4) → 4 × factorial(3) → 4 × 3 × factorial(2) → 4 × 3 × 2 × factorial(1) → 4 × 3 × 2 × 1 = 24

コールスタック可視化

再帰呼び出しがどのようにスタックに積まれて戻っていくか見てみましょう。

フィボナッチ数列

フィボナッチ数列(0, 1, 1, 2, 3, 5, 8, 13, ...)は、2つの再帰呼び出しを行う例です。
int fib(int n) {
    if (n <= 0) return 0;
    if (n == 1) return 1;
    return fib(n - 1) + fib(n - 2);
}
注意: この素朴な実装は n が大きくなると指数的に遅くなります。fib(40) でも数秒かかることがあります。実用ではループやメモ化を使います。
n =

再帰の注意点

スタックオーバーフロー
ベースケースがないと無限再帰 → スタック領域を使い果たしてプログラムがクラッシュします。
パフォーマンス
同じ計算を何度もする再帰は非効率。メモ化(結果を保存)やループへの書き換えを検討しましょう。
再帰が適切な場面
木構造の探索、分割統治法(マージソート等)、数学的帰納法と対応する問題など。

自分で書いてみよう ― 再帰関数

再帰は「小さい問題に分ける形」を自分で書くと定着します。まずは終了条件を書き、次に再帰呼び出しを書きましょう。
課題1: 1〜n の合計
関数 int sum(int n) を再帰で書く。sum(5) が 15 を返せばOK。
課題2: 文字数を数える
int len(const char *s) を再帰で書く。'\0' に着いたら 0 を返す。
課題3: 配列の最大値
先頭から n 個の最大値を返す関数を作る。max(a, n)max(a, n-1) で考える。
間違えたら戻るページ: 関数の形が不安なら 第24回 関数(基本)、呼び出しの流れが不安なら 第25回 関数の深掘り を復習しましょう。

確認クイズ

int mystery(int n) {
    if (n == 0) return 0;
    return n + mystery(n - 1);
}
printf("%d\n", mystery(5));

出力結果は?

5
15
120
0
解説: mystery(5) = 5 + mystery(4) = 5 + 4 + 3 + 2 + 1 + 0 = 15
これは 1〜n の合計を求める再帰関数です。factorial(n!)と混同しないよう注意。

関連する講座

関数編
第24回 関数(基本)
関数の定義、引数、戻り値の基本を確認できます。
関数編
第25回 関数の深掘り
値渡し、コールスタック、関数呼び出しの仕組みを復習できます。
アルゴリズム編
第43回 データ構造入門
木構造や探索など、再帰が活きる場面につながります。
← 前の講座
第31回 確認問題(関数)
次の講座 →
第33回 コマンドライン引数

この講座の理解を深めるおすすめ書籍

サイトで動きを理解し、書籍で演習量を補うと効果的です

📘
苦しんで覚えるC言語
MMGames 著
初心者向けの定番入門書。
Amazonで見る
📗
新・明解C言語 入門編
柴田望洋 著
図解が豊富で演習問題も充実。
Amazonで見る
📙
プログラミング言語C 第2版
B.W.カーニハン, D.M.リッチー 著
通称K&R。C言語の原典。
Amazonで見る

※ 上記リンクはアフィリエイトリンクです。購入によりサイト運営を支援いただけます。

この記事をシェア
X(Twitter)でシェア Facebookでシェア LINEで送る はてブ