知恵袋で見つけた赤玉と白玉の組分けの問題をPythonで解いてみた。(2)

 昨日の続きですが、同じものを含む順列を生成してカウントするんじゃなくて、数学の組合せの公式を使って解いてみました。(^_^;

_nC_r=\frac{n!}{r!(n-r)!}=\frac{_nP_r}{r!}

 簡単な問題をわざわざ難しい方法で解くのも乙なものですが、初めからこちらの方法で解いておけば良かったかな。(^_^;
 Pythonでは、ExcelのPERMUT関数やCOMBIN関数のような順列や組合せの総数自体を求める関数が初めから用意されていなのは意外でした。(^_^;

● RWBalls3.py

# coding: UTF-8
# RWBalls3.py

import math

# 階乗 n!
def fact(n):
    return math.factorial(n)

# 順列 nPr
def perm(n,r):
    return fact(n)/fact(n-r)

# 組合せ nCr
def comb(n,r):
    return perm(n,r)/fact(r)

def main():
    from time import time
    tm=time()  # Timer Start

    total = 0
    for n in range(10+1):
        s = 'r'*n+'|||'
        subTotal = comb(len(s),3)
        total+=subTotal
        print("%13s :%5d"%(s,subTotal))

    print("%11s :%5d"%(u"合計",total))
    tm=time()-tm  # Timer Stop
    print("Runtime : %.3f [sec]"%tm)

if __name__ == '__main__':
    main()

●実行結果

          ||| :    1
         r||| :    4
        rr||| :   10
       rrr||| :   20
      rrrr||| :   35
     rrrrr||| :   56
    rrrrrr||| :   84
   rrrrrrr||| :  120
  rrrrrrrr||| :  165
 rrrrrrrrr||| :  220
rrrrrrrrrr||| :  286
         合計 : 1001
Runtime : 0.000 [sec]

※参考URL
順列・組合せ - 高精度計算サイト
知恵袋で見つけた赤玉と白玉の組分けの問題をPythonで解いてみた。
知恵袋で見つけた赤玉と白玉の組分けの問題をJavaで解いてみた。(2)