C言語の再帰関数を完全解説!初心者でもわかる仕組み・書き方・実用例
生徒
「C言語の本を読んでいたら“再帰関数”という言葉が出てきました。これは何ですか?」
先生
「再帰関数とは、関数の中で自分自身を呼び出すプログラムの書き方のことです。C言語の関数の仕組みを理解するうえでとても大切な考え方です。」
生徒
「関数の中で自分を呼ぶんですか?なんだか難しそうですね。」
先生
「最初は不思議に感じますが、実はとてもシンプルです。例えば“同じ作業を何度も繰り返す処理”をきれいに書くことができます。」
生徒
「なるほど。具体的な使い方を知りたいです。」
先生
「それでは、C言語の再帰関数の基本から実用例まで順番に見ていきましょう。」
1. C言語の再帰関数とは?
C言語の再帰関数(さいきかんすう)とは、関数の中で自分自身を呼び出す関数のことです。普通の関数は別の関数を呼び出しますが、再帰関数では同じ関数を何度も呼び出して処理を進めます。
少しイメージしにくいかもしれませんが、例えば階段を一段ずつ上る作業を考えてみてください。1段上がる処理を繰り返していけば、最終的に上の階に到達できます。再帰関数も同じように、同じ処理を繰り返しながら問題を小さくして解決していきます。
このような考え方はプログラミングのアルゴリズム
2. 再帰関数の基本的な仕組み
再帰関数には必ず次の2つの要素があります。
- ① 自分自身を呼び出す処理
- ② 処理を止める条件(終了条件)
もし終了条件が無いと、関数は永遠に自分を呼び続けてしまいます。これを無限再帰
そのため、再帰関数を書くときはいつ処理を終わらせるのか
3. 再帰関数のシンプルな例(カウントダウン)
まずは非常に簡単な再帰関数の例を見てみましょう。数値を1ずつ減らしながら表示するカウントダウンのプログラムです。
#include <stdio.h>
void countdown(int n)
{
if(n == 0)
{
printf("終了\n");
return;
}
printf("%d\n", n);
countdown(n - 1);
}
int main()
{
countdown(5);
return 0;
}
このプログラムでは、countdown関数の中で再びcountdownを呼び出しています。
5
4
3
2
1
終了
このように処理を少しずつ変えながら同じ関数を呼び出すことで、繰り返し処理を実現しています。
4. 再帰関数の代表例(階乗計算)
再帰関数の代表的な例として階乗(かいじょう)
例えば次のようになります。
5! = 5 × 4 × 3 × 2 × 1
この計算は再帰関数でとてもきれいに書くことができます。
#include <stdio.h>
int factorial(int n)
{
if(n == 1)
{
return 1;
}
return n * factorial(n - 1);
}
int main()
{
int result = factorial(5);
printf("5の階乗は%dです\n", result);
return 0;
}
5の階乗は120です
このように問題を小さな同じ計算に分ける
5. 再帰関数を使った合計計算
次は1から指定した数までの合計を求める再帰関数を作ってみます。
#include <stdio.h>
int sum(int n)
{
if(n == 1)
{
return 1;
}
return n + sum(n - 1);
}
int main()
{
int result = sum(5);
printf("合計は%dです\n", result);
return 0;
}
合計は15です
このプログラムでは、数値を1ずつ減らしながら計算を続けています。こうした処理はループでも書けますが、再帰関数を使うことで処理の流れをシンプルに表現
6. 文字列を逆順に表示する再帰関数
再帰関数は数値計算だけでなく、文字列処理にも使うことができます。次は文字列を逆順に表示する例です。
#include <stdio.h>
void reverse(char *str)
{
if(*str == '\0')
{
return;
}
reverse(str + 1);
printf("%c", *str);
}
int main()
{
char text[] = "HELLO";
reverse(text);
return 0;
}
OLLEH
このように再帰関数はデータを逆順に処理するアルゴリズム
7. 再帰関数を書くときの注意点
C言語で再帰関数を書くときには、いくつかの注意点があります。
- 必ず終了条件を用意する
- 同じ処理を繰り返す構造になっているか確認する
- 深すぎる再帰はメモリを消費する
再帰関数では、関数を呼び出すたびにメモリ(スタック領域)
そのため、必要以上に深い再帰を行うとスタックオーバーフロー
再帰関数はとても便利ですが、処理の仕組みを理解して正しく使うことが大切です。
8. 再帰関数がよく使われる場面
再帰関数はさまざまなプログラムで活用されています。特に次のような処理で使われることが多いです。
- 階乗計算
- 木構造データの探索
- フォルダ構造の探索
- アルゴリズム問題
例えばパソコンのフォルダの中にフォルダがあり、その中にもさらにフォルダがある場合があります。このような入れ子構造
そのため再帰関数はC言語の関数・アルゴリズム・データ構造
まとめ
再帰関数の基本をもう一度振り返ろう
ここまで、C言語の再帰関数について詳しく解説してきました。再帰関数とは、関数の中で自分自身を呼び出すことで処理を進める関数の書き方のことです。C言語のプログラミングを学ぶうえで重要なテーマであり、アルゴリズムやデータ構造の理解にも深く関係しています。
C言語の再帰関数では、同じ処理を繰り返すときに自分自身の関数を呼び出すという特徴があります。普通のプログラムではfor文やwhile文などのループ処理を使いますが、再帰関数では問題を小さく分割しながら処理を繰り返します。
例えば「階乗計算」「合計計算」「文字列の逆順表示」などは、再帰関数で非常にきれいに表現することができます。再帰関数を理解すると、プログラムの構造をシンプルに書けるようになり、アルゴリズムの考え方も自然と身についていきます。
C言語の再帰関数で必ず覚えるべき2つのポイント
C言語の再帰関数を書くときには、必ず覚えておきたい大切なポイントがあります。それは次の2つです。
- 終了条件を必ず用意する
- 問題を小さくしながら自分自身を呼び出す
再帰関数は、同じ関数を何度も呼び出す仕組みになっています。そのため終了条件を設定していないと、関数が永久に呼び出され続けてしまいます。この状態を無限再帰
無限再帰が発生すると、プログラムは途中でエラーになって停止してしまいます。C言語では関数が呼び出されるたびにスタックメモリを使うため、再帰が深くなりすぎるとスタックオーバーフロー
そのため再帰関数を書くときには、「どこで処理を終わらせるのか」を最初に決めておくことがとても重要です。
再帰関数とループ処理の違い
C言語で繰り返し処理を書くときには、for文やwhile文などのループ処理を使うことが多いです。しかし再帰関数を使うと、同じ処理を別の考え方で書くことができます。
例えば「1からNまでの合計」を計算する場合、通常はfor文で書くことが多いでしょう。しかし再帰関数を使えば、数値を1つずつ減らしながら計算を続けることで同じ処理を実現できます。
再帰関数は特に入れ子構造のデータ
- フォルダの中のフォルダを探索する処理
- 木構造データの探索
- アルゴリズム問題の解決
- 階層構造データの処理
こうした構造では、同じ処理を繰り返しながらデータを探索していく必要があります。そのため再帰関数がとても自然な形で使われるのです。
再帰関数の理解を深めるサンプルプログラム
ここで、再帰関数の理解をさらに深めるために、もう一度簡単なサンプルプログラムを見てみましょう。次のプログラムは、指定した数値までの合計を再帰関数で計算する例です。
#include <stdio.h>
int recursive_sum(int n)
{
if(n == 0)
{
return 0;
}
return n + recursive_sum(n - 1);
}
int main()
{
int result = recursive_sum(10);
printf("1から10までの合計は%dです\n", result);
return 0;
}
このプログラムでは、関数recursive_sumの中でrecursive_sumを再び呼び出しています。引数の値を少しずつ減らしていくことで、最終的に終了条件に到達します。
1から10までの合計は55です
このように再帰関数では、問題を小さく分解しながら処理を進めていきます。最初は少し難しく感じるかもしれませんが、何度かコードを書いてみることで理解が深まっていきます。
C言語の再帰関数を学ぶメリット
再帰関数を理解すると、プログラミングの考え方が大きく広がります。特にアルゴリズムを学ぶときには、再帰という考え方が頻繁に登場します。
また、再帰関数は次のようなスキルの向上にも役立ちます。
- プログラムの論理的思考力
- アルゴリズム設計の理解
- 関数の動作の理解
- スタック構造の理解
C言語を学び始めたばかりの初心者にとっては少し難しく感じるかもしれませんが、再帰関数の仕組みを理解すると、プログラムを書く力が大きく向上します。
これからC言語のプログラミングを学習していく中で、再帰関数はアルゴリズム問題やデータ構造の学習でも必ず登場します。ぜひ今回紹介したサンプルコードを実際にコンパイルして実行しながら、再帰関数の動きを体験してみてください。
生徒
「再帰関数って最初は難しそうでしたが、同じ関数を繰り返し呼ぶだけなんですね。」
先生
「その通りです。C言語の再帰関数は“自分自身を呼び出す関数”というシンプルな仕組みです。ただし終了条件を忘れないことがとても大切です。」
生徒
「終了条件がないと無限再帰になるんですよね。」
先生
「はい。終了条件がないと関数が何度も呼ばれてしまい、最終的にはスタックオーバーフローというエラーが発生します。」
生徒
「階乗や合計の計算は、再帰関数でとてもきれいに書けることが分かりました。」
先生
「とても良い理解です。再帰関数はアルゴリズムやデータ構造を学ぶときにもよく使われます。特に木構造やフォルダ探索などの処理では非常に便利です。」
生徒
「C言語の関数の理解も深まりました。これからもっと練習してみます。」
先生
「ぜひ実際にコードを書いて試してみてください。再帰関数は最初は難しく感じますが、理解するとプログラミングの世界がぐっと広がります。」