前提
以下の問題を解いています。漸化式を立て、再帰で解くことを試しております。
dice_number個の、sides面ダイスを振ったとき、出目の総和がtargetとなる確率を出力するプログラムを作成せよ
※再帰についての理解はあまり深くないです。「関数のreturn文に関数自身を書いておくと、プログラムが勝手に何回も走って答を出してくれる」くらいに理解しております。
発生している問題
dice_numberが小さいうちはすぐに答えが出るのですが、10前後になるとプログラムが終了しません。
また、出力そのものの正しさについては、小さいdice_numberで確認しております。
###方針
dice_numberをn, sidesをs, targetをtと書きます。問題の条件を満たす場合の数N=N(n,s,t)は漸化式
N(n,s,t)=N(n-1,s,t-1)+N(n-1,s,t-2)+...+N(n-1,s,t-s)
を満たすので、再帰で計算できる(はず)。
該当のソースコード
python3.7.1
1# 場合の数Nを求める 2def N(dice_number: int, sides: int, target: int) -> int: 3 # 初期条件 4 if dice_number == 1: 5 if 1 <= target <= sides: 6 return 1 7 else: 8 return 0 9 # 漸化式の本体 10 else: 11 return sum([N(dice_number-1, sides, target-i) for i in range(1, sides+1)]) 12 13 14# 場合の数Nを全組み合わせのsides**dice_numberで割ると確率になる 15def probability(dice_number, sides, target): 16 return N(dice_number, sides, target)/sides**dice_number
教えていただきたいこと
- そもそも再帰で解くのが最適な問題なのでしょうか?
- (もしそうだとすれば)どこを直せばもっと高速に動作するプログラムになるのでしょうか?
ご教示お願い致します。
補足情報(FW/ツールのバージョンなど)
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/03/13 13:00 編集
退会済みユーザー
2019/03/13 13:06
2019/03/13 13:11