C言語の再帰関数とは?階乗計算プログラムでわかりやすく解説
再帰関数(Recursive Functions)とは、何かを自分自身を使って定義する手法のことで、具体的には「関数の本体の中で自分自身を再度呼び出す関数」を指します。一見すると不思議な仕組みですが、問題をより小さな単位に分割して解決する際に非常に強力なテクニックとなります。
再帰関数の基本概念
ここでは、整数 N の階乗 を計算する関数 fact() を例に説明します。階乗とは、1 から N までのすべての整数を掛け合わせた値のことです。
この関数の動作は以下のとおりです。
- fact() が引数 0 または 1 で呼び出された場合、関数は 1 を返します(これを「基底条件」と呼びます)。
- それ以外の場合は、n × fact(n-1) の結果を返し、n が 1 になるまで呼び出しが繰り返されます。
fact(5) の計算の流れ
fact(5) = 5 * fact(4)
= 5 * 4 * fact(3)
= 5 * 4 * 3 * fact(2)
= 5 * 4 * 3 * 2 * fact(1)
= 5 * 4 * 3 * 2 * 1
= 120
このように、各呼び出しが次の小さな問題(n-1 の階乗)を生成し、最終的に基底条件に到達した時点で結果が順番に戻されていきます。
C言語による再帰関数の実装例
以下は、再帰関数を使って階乗を求める C プログラムです。
#include<stdio.h>
int main(void){
int n, f;
int fact(int);
printf("enter a number");
scanf("%d", &n);
f = fact(n);
printf("factorial value = %d", f);
}
int fact(int n){
int f;
if ((n == 1) || (n == 0))
return 1;
else
f = n * fact(n - 1);
return f;
}
プログラムのポイント
- main 関数では、ユーザーから数値を入力として受け取り、fact() を呼び出して結果を表示しています。
- fact 関数内では、n が 0 または 1 のときに 1 を返すことで再帰を終了させています。この終了条件がないと、関数が無限に呼び出され続け、スタックオーバーフローが発生するため注意が必要です。
実行結果
上記のプログラムを実行すると、以下のような出力が得られます。
Enter a number 5 Factorial value = 120
まとめ
再帰関数は、階乗計算のように「同じ処理を縮小しながら繰り返す」問題に適した手法です。コードを簡潔に書けるというメリットがある一方で、必ず終了条件(基底条件)を設定することが重要です。フィボナッチ数列の計算や木構造の探索など、さまざまな場面で活用されるため、ぜひマスターしておきましょう。
-
C言語のループ制御文(for・while・do-while)を徹底解説!フローチャートとサンプルコード付き
C言語におけるループ制御文は、同じ処理を何度も繰り返し実行したい場合に使われる重要な構文です。毎回コードを書き連ねる必要がなくなり、プログラムを簡潔かつ効率的に記述できます。 C言語で利用できるループ制御文は、主に以下の3種類です。 for文 while文 do-while文 本記事では、それぞれの構文の書き方、フローチャートによる動作の流れ、実際に動くサンプルプログラムと実行結果まで、初心者にもわかりやすく解説します。 for文とは?基本構文と使い方 for文は、「初期化」「条件式」「増減式」を1行にまとめて記述できる、最もよく使われるループ構文です。繰り返す回数があらかじめ決まっている
-
C言語におけるユニオンとポインタの使い方を徹底解説
ユニオン(共用体)とは、異なるデータ型を持つ複数の変数が、同一のメモリ領域を共有するための仕組みです。構造体が各メンバーごとに独立したメモリを割り当てるのに対し、ユニオンではすべてのメンバーが同じアドレスを参照するという点が大きな特徴です。 ユニオンの構文 ユニオンを定義するときの基本的な書式は次の通りです。 union タグ名{ データ型 メンバー1; データ型 メンバー2; ---- ---- データ型 メンバーn; }; 実際の記述例を見てみましょう。 union sample{ int a; float b; char