見出し画像

朝の10分プログラミング(14日目、2024年6月20日)解説

本日の課題、おつかれさまでした。

異なる$${7}$$個のものから$${3}$$個を取る組合せの総数$${{}_7 C_3}$$を計算するプログラムを作成することができたでしょうか。

プログラム例

プログラム例を示しておきます。

// 異なるn個のものからr個を取る組合せの総数
void setup(){
  
  int n = 7;
  int r = 3;
  int p = 1; // 組合せの総数の分子
  int q = 1; // 組合せの総数の分母
  for(int i=0; i<r; i++){ 
    p = p * (n-i);
    q = q * (r-i);
  }
  int c = p / q; // 組合せの総数を計算
  println(c); // 組合せの総数をコンソールに出力
}

ソースコード1 異なる$${7}$$個のものから$${3}$$個を取る組合せの総数$${{}_7 C_3}$$を計算するプログラムの例

開発環境ウィンドウを立ち上げて、テキストエディタ部分にソースコード1を書き写して、実行ボタンを押してみると、コンソールに 35 と出力されることを確かめてみてください(図1)。

図1 コンソールに「35」と出力される

この結果は、

$$
{}_7 C_3 = \frac{7 \cdot 6 \cdot 5}{3 \cdot 2 \cdot 1} = 35
$$

と一致しています。

解説

昨日の課題と同様に、今回の課題は「$${_7 C_3}$$を計算する」ことですので、$${_7 C_3 = 7 \cdot 6 \cdot 5 / (3 \cdot 2 \cdot 1)}$$をそのまま、

void setup(){
  int c = 7*6*5/(3*2*1);
  println(c);
}

のように書いても、問題ありません。でも、やはりこれだと、ちょっと味気ないですね。やはり$${{}_7 C_2}$$とか$${{}_8 C_3}$$などの添え字の値を変えても計算できるようにはしたいところです。その一つの例が、ソースコード1になると思います。
実際、ソースコード1では、

  int n = 7;
  int r = 2;

とすれば、$${_7 C_2}$$が計算できますし、また、

  int n = 8;
  int r = 3;

とすれば、$${_8 C_3}$$が計算できます。変更して試してみてください。

もう一点、ソースコード1の for ループの部分で変数 i を 0 から r-1 までの r 個の値をループさせていますが、この部分は

for(int i=0; i<=r-1; i++){

と書いても問題ないです。ただ、0 から始まる r 回のループを行う場合は、ソースコード1のように

for(int i=0; i<r; i++){

と書くことが多いようです。コード的にシンプルですし、見た目もきれいな気がしますのでこちらが選ばれるのでしょう。

なお、今回の課題については、記事『高校数学をプログラミングで解く(数学A編)「1-4 組合せ」』に詳しい解説を載せていますので、そちらをご覧ください。
また、この記事の下の方に、組合せの総数を数えるプログラムの問題点について解説しています。int型変数の扱いに関わる重要な点ですので、時間があれば一度目を通しておいてください。

明日は「確率」に関する課題をプログラミングで解くことを考えていきます。

明日もよろしくお願いします。

MK’s papa

この記事が気に入ったらサポートをしてみませんか?