C++で漸化式を使って組み合わせ(nCr)を計算するプログラムの解説
本記事では、漸化式(再帰関係)を利用して組み合わせ nCr を求める C++ プログラムを紹介します。組み合わせとは、n 個の要素から r 個を選ぶときの選び方の総数のことであり、数学的には次の公式で定義されます。
nCr = n! / (r! × (n−r)!)
この公式をそのまま階乗で計算すると数が巨大化しやすいため、本プログラムでは次のような漸化式の性質を利用して再帰的に計算を行います。
nCr = (n / r) × (n−1)C(r−1)
アルゴリズム
Begin
function CalCombination():
引数:n, r
関数の処理内容:
漸化式 nCr = (n/r) × (n-1)C(r-1)
を用いて組み合わせを再帰的に計算する
End
サンプルコード
#include<iostream>
using namespace std;
float CalCombination(float n, float r) {
int i;
if(r > 0)
return (n/r)*CalCombination(n-1,r-1);
else
return 1;
}
int main() {
float n, r;
int res;
cout<<"Enter the value of n: ";
cin>>n;
cout<<"Enter the value of r: ";
cin>>r;
res = CalCombination(n,r);
cout<<"\nThe number of possible combinations are: nCr = "<<res;
}
実行結果
Enter the value of n: 7 Enter the value of r: 6 The number of possible combinations are: nCr = 2
プログラムの解説
関数 CalCombination() は、引数として受け取った n と r を用いて再帰呼び出しを行います。r が 0 より大きい間は「(n / r) × (n−1)C(r−1)」という漸化式に従って自分自身を呼び出し続け、r が 0 になった時点で 1 を返すことで再帰を終了します。
例えば n = 7、r = 6 の場合、7C6 の値は 7! / (6! × 1!) = 7 ではなく、実際には 7 通りの選び方が存在するため注意が必要です。ただし、このプログラムでは戻り値を int 型変数 res に格納しているため、小数点以下が切り捨てられて誤差が生じる可能性があります。正確な結果を得たい場合は、戻り値や変数の型を見直すことをおすすめします。
まとめ
このように、漸化式と再帰関数を組み合わせることで、大きな階乗の計算を避けながら簡潔に組み合わせを求めることができます。再帰の仕組みを理解する練習問題としても非常に有用なサンプルです。
-
C++でピラミッドの体積を計算するプログラムの作り方|底面の形状別の公式と実装例
ピラミッドの底面の種類に応じた辺の長さが与えられたとき、そのピラミッドの体積を計算するのが本記事のテーマです。 ピラミッドとは、外側の面がすべて三角形で構成され、それらが共通の一点(頂点)で交わることで鋭い角を形成する3次元図形です。ピラミッドの体積は、底面がどのような形状であるかによって異なります。 ピラミッドの底面にはさまざまな種類があり、代表的なものは以下の通りです。 底面の形状別の体積の求め方 三角形の底面(三角錐) 底面が三角形の場合、ピラミッドの体積は次の公式で求められます。 体積 = (1/6) × a × b × h 正方形の底面(四角錐) 底面が正方形の場合、ピラミッドの体
-
C++で学ぶクイックソート(QuickSort)の仕組みと実装方法
クイックソートとはクイックソート(Quicksort)は、比較に基づいて未ソートのリスト(配列)を並べ替えるソートアルゴリズムの一つです。「パーティション交換ソート(partition exchange sort)」とも呼ばれます。クイックソートは安定ソートではありません。これは、等しい値を持つ要素同士の相対的な順序が保持されないためです。ただし、配列に対してごくわずかな追加メモリだけで動作するため、メモリ効率に優れています。選択ソートと非常に似ていますが、常に最悪のパーティションを選んでしまうわけではない点が異なり、より洗練された形の選択ソートと捉えることもできます。クイックソートは最も効率