C++で再帰を使って数値の階乗を計算する方法【初心者向け解説】
非負整数 n の階乗(factorial)とは、n 以下のすべての正の整数を掛け合わせた値のことです。
例えば、7 の階乗は次のように計算され、結果は 5040 になります。
7! = 7 * 6 * 5 * 4 * 3 * 2 * 1 7! = 5040
この記事では、再帰(recursion)を使って数値の階乗を求める C++ プログラムを紹介します。
サンプルコード
#include <iostream>
using namespace std;
int fact(int n) {
if ((n==0)||(n==1))
return 1;
else
return n*fact(n-1);
}
int main() {
cout<<"Factorial of 5 is "<<fact(5)<<endl;
cout<<"Factorial of 3 is "<<fact(3)<<endl;
cout<<"Factorial of 7 is "<<fact(7)<<endl;
return 0;
}実行結果
Factorial of 5 is 120 Factorial of 3 is 6 Factorial of 7 is 5040
コードの解説
上記のプログラムでは、fact() 関数が再帰関数として定義されています。main() 関数から、階乗を求めたい数値を引数として fact() を呼び出します。該当するコード部分は以下の通りです。
cout<<"Factorial of 5 is "<<fact(5)<<endl; cout<<"Factorial of 3 is "<<fact(3)<<endl; cout<<"Factorial of 7 is "<<fact(7)<<endl;
引数が 0 または 1 の場合、fact() は 1 を返します。それ以外の場合は、引数を n-1 として自分自身を再帰的に呼び出します。このとき、n と再帰呼び出し fact(n-1) の戻り値を掛け合わせることで、最終的に次のような計算が行われます。
n*(n-1)*(n-2)...3*2*1 = n の階乗
この再帰処理を実現しているのが、以下のコードです。
int fact(int n) {
if ((n==0)||(n==1))
return 1;
else
return n*fact(n-1);
}再帰関数を書く際のポイント
再帰関数には必ず終了条件(ベースケース)が必要です。このプログラムでは「n が 0 または 1 のときに 1 を返す」部分がそれに相当します。もし終了条件がなければ、関数は無限に自分自身を呼び出し続け、スタックオーバーフローを引き起こすため注意が必要です。
-
C++で階乗の最初の桁を求めるプログラムの作成方法
このチュートリアルでは、与えられた数値の階乗(階乗値)の最初の桁(最上位桁)を求めるプログラムをC++で作成します。まず、具体的な例を見てみましょう。 入力 − 7 出力 − 5 これは、7の階乗が 7! = 5040 であり、その最初の桁が「5」であるためです。それでは、問題を解くための手順を確認していきましょう。 解き方の手順 対象となる数値を初期化します。 その数値の階乗を計算します。 階乗の値が1桁になるまで、10で割り続けます。 サンプルコード それでは、実際のコードを見てみましょう。 #include <bits/stdc++.h> using namespace
-
C++の再帰を使って木(ツリー)のサイズを計算するプログラムの作成方法
この問題では、二分木が与えられ、「再帰」を使って木のサイズを計算するプログラムを作成することが課題となります。 ここでいう木のサイズとは、その木に含まれるノードの総数のことです。 具体例を見ながら問題を理解していきましょう。 上の木の場合、サイズは 5 となります。 解法の考え方:再帰によるサイズ計算 木のサイズを求めるには、左部分木のサイズ + 右部分木のサイズ + 1(現在のノード) を計算します。再帰関数は、木の左右それぞれの部分木に対して呼び出され、部分木が存在しない(NULL の)場合は 0 を返します。 上記の例をこの手法で解いてみる ルート(値3)のサイズを求める場合: si