【Python】円順列を計算する関数を作成し、丸テーブルに座る場合の数を求める

■概要

場合の数のうち、円順列について、
机上計算とPythonを使用した計算処理の2種類の解答方法を示す。

■円順列

円順列とは、丸いテーブルに複数人が着席するときの場合の数を算出する方法である。

以下のように、丸テーブルに4人が着席した場合、①のテーブルを時計回りに回すと、②〜④の座り順となる。

丸テーブルに4人が座るときのイメージ


この①〜④の場合、座り位置が異なるだけで、各々の隣人は変わらない。
したがって、①〜④の4組の配置は同一の場合の数と考えるため、解答は以下の通り。

4!/ 4
= (4・3・2・1) / 4
= 6 (通り)

▼円順列の公式

n個を円形に並べた時の場合の数は以下の公式を使用する。

■例題

両親と子ども4人が丸テーブルに座る時、以下の問いを求める。

▼問1

家族6人が座る座り方は、何通りあるか。

▼問2

両親が隣り合って座る座り方は、何通りあるか。

■机上計算

▼問1

以下の図のように、6人が丸テーブルに座る場合の数は、
6!/ 6
= (6・5・4・3・2・1) / 6
= 120 (通り)

▼問2

両親(2人)と子ども(4人)と分けて考える必要がある。
また、両親は必ず隣り合っていることが条件であるため、
以下の図のように、両親(2人:B、Cとする)を1人として考える。

5人が丸テーブルに座る場合の数は、
5!/ 5
= (5・4・3・2・1) / 5
= 24 (通り)

両親の座り位置が入れ替わる場合も考慮する必要があるため、求める場合の数は、
24 × 2 = 48 (通り)

■Pythonによる実装

▼フローチャート

▼プログラム仕様

<処理名:円順列を計算する関数>

・引数と戻り値

項目内容
第1引数nn P r のうち、「n」
第2引数rn P r のうち、「r」
戻り値計算結果円順列の計算結果

・処理概要

入力処理内容出力
戻り値用の初期値をセットする。
初期値:1
計算用の一時変数を用意する。
初期値:第一引数(n)
n P r のうち、「r」の回数分ループ
|戻り値用の値に「n」をかける。
|「n」を-1する。
円順列として、重複分を削除する。
戻り値として、計算結果を返す。【戻り値】
計算結果

▼サンプルコード

# 円順列を算出する関数
def CalCircularPermutation(n: int, r: int) -> int:
    # 戻り値の初期値をセット
    cal_data = 1
    # 計算用一時変数
    cal_tmp = n

    # nPrのうち、r回数分ループする
    for _ in range(r):
        # nPrのうち、n(cal_tmp)で掛け算
        cal_data = cal_data * cal_tmp

        # デクリメント処理
        cal_tmp = cal_tmp - 1

    # 重複分を削除
    cal_data = cal_data / n

    # 戻り値を返す
    return int(cal_data)


if __name__ == '__main__':
    print('問1:', CalCircularPermutation(5, 5), '通り')
    print('問2:', CalCircularPermutation(4, 4) * 2, '通り')

▼実行結果

問1: 120 通り
問2: 48 通り

コメント