カテゴリ: VB.NET 更新日: 2026/02/07

VB.NETで再帰処理を行う方法と活用例を初心者向けに解説

VB.NETで再帰処理を行う方法と活用例
VB.NETで再帰処理を行う方法と活用例

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

生徒

「先生、VB.NETで自分自身を呼び出すメソッドって作れるんですか?」

先生

「はい、それを再帰処理と呼びます。メソッドや関数が自分自身を呼び出すことで、繰り返し処理や階層構造の処理を簡単に書くことができます。」

生徒

「でも、自分を呼ぶとずっとループして止まらなくなりませんか?」

先生

「良い質問です。再帰処理では終了条件を必ず作る必要があります。この条件に達したら再帰を止めることで、無限ループを防ぎます。」

1. 再帰処理とは?

1. 再帰処理とは?
1. 再帰処理とは?

VB.NETの再帰処理とは、メソッドや関数が自分自身を呼び出すプログラムの書き方です。例えば階乗の計算やフィボナッチ数列の生成、フォルダ内のファイル検索など、同じ処理を繰り返す必要がある場面で活躍します。再帰処理では、基本ケース(終了条件)再帰ケース(自分を呼ぶ処理)の2つを組み合わせます。

2. VB.NETで再帰処理を書く基本の構文

2. VB.NETで再帰処理を書く基本の構文
2. VB.NETで再帰処理を書く基本の構文

再帰処理の基本は、自分自身を呼び出すメソッドに条件分岐を入れることです。例えば、1からnまでの合計を計算する場合は次のように書けます。


Function SumToN(n As Integer) As Integer
    If n <= 0 Then
        Return 0 '終了条件
    Else
        Return n + SumToN(n - 1) '再帰処理
    End If
End Function

Console.WriteLine(SumToN(5))

15

ここでは、nが0以下になったら再帰を止める終了条件を設けています。これにより、1+2+3+4+5の合計が正しく計算されます。

3. フィボナッチ数列を作る再帰の例

3. フィボナッチ数列を作る再帰の例
3. フィボナッチ数列を作る再帰の例

再帰処理は階段状に数列を作るときにも便利です。フィボナッチ数列は、前の2つの数を足して次の数を作る数列です。VB.NETで書くと次のようになります。


Function Fibonacci(n As Integer) As Integer
    If n = 0 Then
        Return 0 '終了条件
    ElseIf n = 1 Then
        Return 1 '終了条件
    Else
        Return Fibonacci(n - 1) + Fibonacci(n - 2) '再帰処理
    End If
End Function

For i As Integer = 0 To 9
    Console.Write(Fibonacci(i) & " ")
Next

0 1 1 2 3 5 8 13 21 34

再帰を使うと、数列の規則性をそのままプログラムに表現でき、初心者でも理解しやすいです。

4. 再帰処理の活用例:フォルダ内のファイル検索

4. 再帰処理の活用例:フォルダ内のファイル検索
4. 再帰処理の活用例:フォルダ内のファイル検索

再帰処理はフォルダやディレクトリの階層構造を処理するときにも使えます。例えば、指定フォルダ以下にあるすべてのファイルを検索して名前を表示する場合です。


Sub ListFiles(folderPath As String)
    For Each file As String In System.IO.Directory.GetFiles(folderPath)
        Console.WriteLine(file)
    Next
    For Each subFolder As String In System.IO.Directory.GetDirectories(folderPath)
        ListFiles(subFolder) '再帰呼び出し
    Next
End Sub

ListFiles("C:\Example")

このように再帰を使うと、深い階層のフォルダでも簡単にすべてのファイルを処理できます。

5. 再帰処理の注意点

5. 再帰処理の注意点
5. 再帰処理の注意点
  • 必ず終了条件を作ること。終了条件がないと無限ループになり、プログラムがクラッシュします。
  • 再帰処理は呼び出し回数が増えるとメモリを多く消費するため、大きな数値や深い階層の場合は注意が必要です。
  • 簡単な繰り返し処理はForWhileを使った方が効率的な場合があります。

6. まとめると

6. まとめると
6. まとめると

VB.NETで再帰処理を使うと、階乗計算やフィボナッチ数列、フォルダ検索など、繰り返しや階層構造の処理を自然に表現できます。ポイントは終了条件を必ず設定することと、自分自身を呼ぶ再帰ケースを理解することです。再帰処理をマスターすると、より複雑な問題もシンプルに解けるようになります。

まとめ

まとめ
まとめ

VB.NETにおける再帰処理の学習、お疲れ様でした。プログラムの世界では、同じような処理を何度も繰り返す場面が多々あります。通常はFor文やWhile文といったループ構文を使いますが、データの構造が「木構造」であったり、数学的な定義そのものが自分自身を参照していたりする場合、この「再帰(Recursion)」という手法が非常に強力な武器になります。

再帰処理の核心:終了条件と自己呼び出し

再帰処理をマスターするための最重要ポイントは、何と言っても「いつ止めるか」を決める終了条件(ベースケース)です。これが正しく記述されていないと、コンピュータのメモリが溢れてしまう「スタックオーバーフロー」というエラーを引き起こしてしまいます。逆に言えば、終了条件さえしっかりと定義できていれば、複雑に見える階層構造の探索やアルゴリズムの実装も、驚くほどシンプルに記述できるのが再帰の魅力です。

実践的な活用シーンと応用

記事で紹介したフォルダ探索以外にも、再帰処理はWebアプリケーションの開発や業務システムの構築で頻繁に登場します。例えば、組織図の表示、部品構成表(BOM)の展開、あるいは多階層のカテゴリメニューの動的生成などです。これらの処理をループだけで書こうとすると、コードが非常に複雑になり、バグが入り込む隙を与えてしまいます。再帰を使うことで、コードの可読性が向上し、メンテナンスのしやすいプログラムを作成することが可能になります。

応用例:ディレクトリ構成をHTMLのリスト形式で出力するプログラム

ここでは、学んだことを応用して、特定のフォルダ構造をHTMLのアンオーダードリスト(ul・liタグ)として出力する関数を作成してみましょう。これにより、ウェブページ上でのサイトマップ作成などのイメージが湧きやすくなるはずです。


''' <summary>
''' フォルダ構造をHTMLリスト形式で再帰的に取得する関数
''' </summary>
Function GetDirectoryHtml(ByVal targetPath As String) As String
    Dim htmlResult As String = ""
    Try
        ' フォルダ名を取得してリスト項目を開始
        Dim dirInfo As New System.IO.DirectoryInfo(targetPath)
        htmlResult &= "<li>" & dirInfo.Name

        ' サブディレクトリの取得
        Dim subDirs() As String = System.IO.Directory.GetDirectories(targetPath)
        
        If subDirs.Length > 0 Then
            htmlResult &= "<ul>"
            For Each subDir As String In subDirs
                ' 自分自身を呼び出す(再帰呼び出し)
                htmlResult &= GetDirectoryHtml(subDir)
            Next
            htmlResult &= "</ul>"
        End If

        htmlResult &= "</li>"
    Catch ex As Exception
        ' アクセス権限がない場合などのエラー回避
        Return "<li>アクセス拒否: " & targetPath & "</li>"
    End Try

    Return htmlResult
End Function

' 実行例
Dim rootPath As String = "C:\SampleData"
Dim finalHtml As String = "<ul>" & GetDirectoryHtml(rootPath) & "</ul>"
Console.WriteLine(finalHtml)

上記プログラムの実行結果(イメージ)は以下のようになります。


<ul><li>SampleData<ul><li>Documents<ul><li>Work</li><li>Private</li></ul></li><li>Images</li></ul></li></ul>

パフォーマンスとメモリへの配慮

最後に、再帰処理を使用する際の「エンジニアとしての視点」を補足します。再帰は非常にエレガントな手法ですが、呼び出し回数が数万回、数十万回を超えるようなケースでは、スタックメモリを消費しすぎる懸念があります。VB.NETを含む現代の環境では、通常のビジネスロジックで問題になることは稀ですが、非常に巨大なデータを扱う際は「ループで書き換えられないか?」を検討する柔軟性も持ち合わせておきましょう。

これからも、様々なアルゴリズムに触れる中で、再帰処理の便利さを実感してみてください。基礎をしっかり固めることが、高度なプログラミングへの近道となります。

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

生徒

「先生、再帰処理のイメージがかなり具体的に湧いてきました。自分の中で処理を繰り返しながら、どんどん奥の階層へ入っていくような感覚ですね!」

先生

「その通りです。マトリョーシカ人形を想像すると分かりやすいかもしれません。大きな人形を開けると中から小さな人形が出てきて、最後に一番小さな、開けられない人形(終了条件)にたどり着くイメージですね。」

生徒

「なるほど!マトリョーシカですか、分かりやすいです。先ほどのコードで、自分自身を呼び出すときに引数の値を変えて渡していましたが、あれが重要なんですね。」

先生

「素晴らしい指摘です。自分を呼び出すときに、一歩ずつ終了条件に近づくようにパラメータを変化させないと、永遠に終わりが来ませんからね。フォルダ検索なら『次の階層のパス』を渡し、数値計算なら『nマイナス1』を渡す。これが再帰を成功させるコツです。」

生徒

「もし終了条件を書き忘れたら、どうなるんですか?」

先生

「プログラムが停止せずに動き続け、最終的には『StackOverflowException』というエラーが発生して強制終了してしまいます。開発中は、まず『どうなったら終わるか』を最初に紙に書き出してからコードを書き始めるのがおすすめですよ。」

生徒

「まずは終わらせ方から考える、ということですね。これなら複雑なフォルダ移動のプログラムも、整理して書けそうな気がします。ありがとうございました!」

先生

「その意気です。再帰を使いこなせれば、VB.NETのプログラミングがもっと楽しくなりますよ。ぜひ自分の手でいろいろなパターンを試してみてくださいね。」

カテゴリの一覧へ
新着記事
New1
ASP.NET
ASP.NET Web APIとMVCの違いを完全解説!初心者でもわかるWebアプリとAPIの基本
New2
ASP.NET
ASP.NET開発環境構築|コマンドライン(dotnet CLI)でASP.NETプロジェクトを作成する方法
New3
VB.NET
VB.NETで文字列を綺麗に整える!String.Formatと文字列補間の使い方
New4
ASP.NET
LinuxでASP.NET Coreを動かす手順|初心者でもわかる開発環境構築ガイド
人気記事
No.1
Java&Spring記事人気No1
VB.NET
VB.NETのJoinメソッドを徹底解説!バラバラの文字列を一つに結合する方法
No.2
Java&Spring記事人気No2
VB.NET
VB.NETの文字列置換を完全解説!初心者でもわかるReplaceメソッドの使い方
No.3
Java&Spring記事人気No3
VB.NET
VB.NETの配列(Array)の作り方と基本操作を徹底解説!初心者でもわかる入門ガイド
No.4
Java&Spring記事人気No4
VB.NET
VB.NETで文字列結合を高速化!StringBuilderクラスの使い方を完全ガイド
No.5
Java&Spring記事人気No5
VB.NET
VB.NETのList(Of T)の使い方を完全ガイド!初心者が最初に覚えるべきリスト操作
No.6
Java&Spring記事人気No6
VB.NET
VB.NETのDictionaryを完全ガイド!初心者でもわかる辞書の基本と応用
No.7
Java&Spring記事人気No7
VB.NET
VB.NETでStaticメソッドを定義する方法と活用例
No.8
Java&Spring記事人気No8
VB.NET
VB.NETのTrimで空白削除!初心者向け文字列整形完全ガイド