カテゴリ: C# 更新日: 2026/04/02

C#の再帰メソッドの基本と注意点をわかりやすく解説

C#の再帰メソッドの基本と注意点をわかりやすく解説
C#の再帰メソッドの基本と注意点をわかりやすく解説

先生と生徒の会話形式で理解しよう

生徒

「先生、C#で同じ処理を何回も繰り返す方法ってありますか?」

先生

「はい、C#では繰り返し処理にループ構文を使う方法と、再帰メソッドという方法があります。」

生徒

「再帰メソッドってなんですか?あまり聞いたことがないです…」

先生

「では、初心者の方にもわかりやすく、再帰メソッドの基本と注意点を丁寧に説明していきましょう。」

1. 再帰メソッドとは?

1. 再帰メソッドとは?
1. 再帰メソッドとは?

再帰(さいき)メソッドとは、一言で言うと「処理の途中で自分自身をもう一度呼び出すメソッド」のことです。プログラミング初心者の方には少しイメージしづらいかもしれませんが、ロシアの民芸品「マトリョーシカ」を想像してみてください。大きな人形を開けると、中から少し小さな同じ形の人形が出てくる、あの構造がまさに再帰のイメージです。

通常のメソッドは、呼び出された処理が終われば呼び出し元に戻ります。しかし、再帰メソッドは、ある問題を「自分自身を使って、より小さな問題に分解して解く」という特徴があります。例えば、「フォルダの中にある全ファイルを調べる」という処理において、「フォルダの中にフォルダがあれば、同じ手順でその中も調べる」といった、入れ子構造(階層構造)のデータを扱う際に非常に強力な武器となります。

ここがポイント!
再帰を使いこなすには、「いつ処理を終わらせるか」という終了条件(ベースケース)が不可欠です。これがないと、自分を呼び出し続ける無限ループに陥り、パソコンのメモリを使い果たしてプログラムが強制終了してしまいます。

まずは、最もシンプルな「自分の名前を3回表示する」という処理を、再帰を使って書いてみましょう。プログラミングが初めての方でも、動きを追いやすいサンプルです。


using System;

class Program
{
    static void Main()
    {
        // 3回表示させるために「3」を渡してスタート
        SayHello(3);
    }

    static void SayHello(int count)
    {
        // 【終了条件】カウントが0になったら、もう自分を呼び出さない
        if (count <= 0)
        {
            return;
        }

        Console.WriteLine("こんにちは! (残り: " + count + "回)");

        // 【再帰呼び出し】カウントを1減らして、自分自身をもう一度呼び出す
        SayHello(count - 1);
    }
}

このプログラムの実行結果は以下のようになります。


こんにちは! (残り: 3回)
こんにちは! (残り: 2回)
こんにちは! (残り: 1回)

この例では、SayHello(3)が実行されると、その中でSayHello(2)を呼び出し、さらにその中でSayHello(1)を呼び出しています。最後にcountが0になったとき、return(メソッドを終了する命令)が実行されることで、数珠つなぎの呼び出しが止まる仕組みになっています。

2. 簡単な再帰メソッドの例:1からnまでの合計

2. 簡単な再帰メソッドの例:1からnまでの合計
2. 簡単な再帰メソッドの例:1からnまでの合計

再帰処理を理解するための最初の一歩として、「1からnまでの数字をすべて足し合わせる」という計算を考えてみましょう。例えばnが5なら、「5 + 4 + 3 + 2 + 1 = 15」を求めるプログラムです。

プログラミング未経験の方にとって、自分自身を呼び出すという動きは少し不思議に感じるかもしれません。しかし、これは「大きな問題を、少しだけ小さな問題に分解して解く」という非常に合理的な考え方に基づいています。C#での具体的な書き方を見ていきましょう。


using System;

class Program
{
    static int Sum(int n)
    {
        // 1. 終了条件(ベースケース):これ以上分解できない最小の単位
        if (n == 1)
        {
            return 1;
        }

        // 2. 再帰呼び出し:問題を一段階小さくして自分に任せる
        // n(現在の値) に 「n-1までの合計」を足すという考え方
        return n + Sum(n - 1);
    }

    static void Main()
    {
        int number = 5;
        int result = Sum(number);
        Console.WriteLine("1から" + number + "までの合計は: " + result);
    }
}

このプログラムの動きをイメージしてみましょう。Sum(5)を呼び出すと、内部では次のような連鎖が起きています。

  • Sum(5)5 + Sum(4) の結果を待つ
  • Sum(4)4 + Sum(3) の結果を待つ
  • ...(中略)...
  • Sum(1)1 を返して、ようやく計算の連鎖が逆順に解けていく

このように、「これ以上小さくできない条件(n=1)」にたどり着くまで処理を積み上げていき、最後に一気に計算を完了させるのが再帰の仕組みです。

実行結果は以下のようになります。


1から5までの合計は: 15

3. 再帰メソッドのしくみを図解的に理解しよう

3. 再帰メソッドのしくみを図解的に理解しよう
3. 再帰メソッドのしくみを図解的に理解しよう

再帰メソッドは、呼び出しが繰り返されていく構造を持っています。処理の流れをイメージすると、以下のようになります。

  • Sum(5) → Sum(4)
  • Sum(4) → Sum(3)
  • Sum(3) → Sum(2)
  • Sum(2) → Sum(1)
  • Sum(1) → 1(終了条件)

ここで計算された1の値から順に戻っていき、2 + 1 → 33 + 3 → 64 + 6 → 105 + 10 → 15と計算されます。

4. 再帰メソッドの注意点

4. 再帰メソッドの注意点
4. 再帰メソッドの注意点

再帰メソッドは便利ですが、いくつか注意点があります。

  • 終了条件を必ず入れること
    終了条件がないと、メソッドが無限に自分を呼び出し続けてしまい、パソコンが止まる可能性があります。
  • スタックオーバーフローに注意
    再帰はスタック(一時的な記憶場所)に呼び出しの情報をためていくので、回数が多すぎると「スタックオーバーフロー」というエラーになります。
  • ループの方が向いている場面もある
    同じ処理でも、for文やwhile文のようなループのほうが効率的な場合もあります。

5. 再帰とループの違いとは?

5. 再帰とループの違いとは?
5. 再帰とループの違いとは?

再帰メソッドとループは、どちらも繰り返し処理を行う手段ですが、考え方に違いがあります。

  • ループ:一定の条件で繰り返す処理。処理が直線的でわかりやすい。
  • 再帰:問題を分割して、少しずつ解決していく。数学的な考え方に近い。

例えば、ループを使って1〜nの合計を求める方法は以下のようになります。


int total = 0;
for (int i = 1; i <= 5; i++)
{
    total += i;
}
Console.WriteLine("合計は: " + total);

合計は: 15

結果は同じですが、処理の進み方が再帰と違うのがわかりますね。

6. どんなときに再帰を使うの?

6. どんなときに再帰を使うの?
6. どんなときに再帰を使うの?

再帰メソッドは以下のような場面で使われることが多いです。

  • 階乗(かいじょう)計算:n!(エヌの階乗)
  • フィボナッチ数列:前の2つの数を足して次を作る
  • ファイルやフォルダの中身をすべてたどる処理
  • 木構造の探索:メニューやカテゴリの構成

これらは一見複雑に見える処理ですが、再帰を使うとすっきり書けることが多いです。

まとめ

まとめ
まとめ

C#の再帰メソッドは、自分自身を呼び出すという特徴的な書き方で、複雑な処理をシンプルに表現できる強力な手法です。この記事では、再帰メソッドの基本構造から、典型的な活用例、終了条件の重要性、ループとの違い、そして注意すべき点まで、丁寧に整理して解説してきました。

初心者の方にとって再帰という言葉はなじみが薄く、最初は少し難しそうに感じるかもしれません。しかし、「同じ作業を繰り返して段階的に問題を解く」という考え方に触れることで、プログラムの見方が一段と深くなります。特に再帰は、数学的な処理や木構造、ファイル操作などにとても適しており、慣れてくると「再帰で書いたほうがわかりやすい」と感じる場面が増えてきます。

ここで、階乗(かいじょう)の計算を行う再帰メソッドの例をもう一度確認してみましょう。階乗とは、5!のように表され、「5 × 4 × 3 × 2 × 1」というように数を順に掛けていく処理です。


using System;

class Program
{
    static int Factorial(int n)
    {
        if (n == 1)
        {
            return 1; // 終了条件
        }
        return n * Factorial(n - 1); // 自分自身を呼ぶ
    }

    static void Main()
    {
        int result = Factorial(5);
        Console.WriteLine("5の階乗は: " + result);
    }
}

このプログラムでは、Factorialメソッドが自分自身を呼び出しながら、nの値を1まで減らしていきます。終了条件にたどり着くと、今度は結果を掛け合わせながら呼び出し元に戻っていきます。こうした流れは、積み重ねてから戻るという再帰の基本的な構造を理解するのに最適な例です。

また、再帰には注意点もあります。必ず終了条件を設定することは、最も大切なルールです。終了条件がないと、呼び出しが終わらずにスタックオーバーフローエラーが発生し、プログラムが強制終了してしまいます。また、呼び出しの深さが極端に大きくなる場合、ループの方が処理速度やメモリの面で有利になることもあります。状況に応じて、ループと再帰を使い分ける判断力が求められます。

なお、再帰は必ずしも万能ではありませんが、自然な構造を持つ問題(木構造や分岐の多い問題)には非常に効果的です。再帰を使うことで、短くて読みやすいコードを実現することができ、複雑なアルゴリズムでも直感的に理解しやすくなります。たとえば、ファイルシステムの中身をすべて調べたいとき、カテゴリ階層を順にたどるときなど、再帰が活躍する場面は数多く存在します。

最後にもう一つの実例として、フィボナッチ数列を再帰で求めるコードを紹介しておきましょう。


static int Fibonacci(int n)
{
    if (n == 0) return 0;
    if (n == 1) return 1;
    return Fibonacci(n - 1) + Fibonacci(n - 2);
}

static void Main()
{
    for (int i = 0; i < 10; i++)
    {
        Console.Write(Fibonacci(i) + " ");
    }
}

このコードでは、Fibonacciメソッドが自身を2回呼び出す形になっており、前の2つの値を足して次の数を作るというフィボナッチの特徴をきれいに再現しています。ただし、計算回数が多くなるので、最適化が必要な場面もあります。

再帰は、考え方そのものがプログラム設計に直結する非常に奥深い技術です。習得すれば、データ構造やアルゴリズムの理解も一段と深まり、C#でより柔軟なロジックを組めるようになります。最初は少しとっつきにくく感じるかもしれませんが、基本の使い方と注意点さえおさえておけば、必ず大きな武器になります。

先生と生徒の振り返り会話

生徒

「再帰メソッドって最初は不思議な感じでしたけど、だんだん面白くなってきました!」

先生

「そうですね。自分を呼び出すというのは慣れが必要ですが、実はとてもシンプルな考え方なんです。」

生徒

「階乗の計算やフィボナッチ数列の例がわかりやすかったです。特に、階段を下るようなイメージがピンときました。」

先生

「再帰は問題を分けて解決するのにとても役立ちます。今回のような基本的な例から、木構造の探索などの応用まで広く使えますよ。」

生徒

「ただ、終了条件を忘れると止まらなくなるっていうのは注意しないとですね…」

先生

「そこが一番のポイントです。終了条件と、無限ループにならない設計を意識すれば、安全に使いこなせますよ。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

C#の再帰メソッドとは何ですか?初心者にもわかりやすく説明してください。

C#の再帰メソッドとは、自分自身を呼び出すメソッドのことです。階段を一段ずつ下りるように、問題を細かく分けながら処理を進めるためのしくみで、複雑な計算や構造をシンプルに表現できます。
カテゴリの一覧へ
新着記事
New1
C#
C#のメソッドのオーバーロードとは?同名メソッドを複数定義する方法
New2
C#
C#の出力と入力の基本をマスター!初心者でもわかるConsole.WriteLine()とConsole.ReadLine()の使い方
New3
C#
C# GUIアプリでファイルダイアログを使う方法!WinFormsとWPFの基本操作を完全解説
New4
Azure
Azure SQL Databaseの認証設定を徹底解説!Entra ID(旧Azure AD)統合でセキュアなデータベース管理を実現する方法
人気記事
No.1
Java&Spring記事人気No1
C#
C#の日付型(DateTime)と基本的な使い方を解説|初心者向け入門ガイド
No.2
Java&Spring記事人気No2
C#
C#でswitch式を使う方法!C# 8.0以降の新機能を解説
No.3
Java&Spring記事人気No3
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.4
Java&Spring記事人気No4
C#
C# WinForms入門!初心者でも簡単にWindowsアプリを作る方法
No.5
Java&Spring記事人気No5
C#
C#の文字列を数値に変換する方法(int.Parse・TryParse)をわかりやすく解説!
No.6
Java&Spring記事人気No6
C#
C#のログ出力入門!SerilogとNLogの使い方を徹底解説
No.7
Java&Spring記事人気No7
Azure
Azure Bastionの使い方を徹底解説!踏み台サーバー不要で安全にRDP/SSH接続
No.8
Java&Spring記事人気No8
C#
C#のWPFとは?XAMLでGUI開発を基礎から完全解説!初心者向けの入門ガイド