掷骰子组合问题
2019獨角獸企業重金招聘Python工程師標準>>>
擲N個骰子,最小值是Nx1,最大值是NxSides,組合數是Sides^N次方.
通過觀察下面簡單的2個骰子的情形,可以看出這是個典形的遞歸。
?
| Index | Dice1 | Dice2 | Sum |
| 1 | 1 | 1 | 2 |
| 2 | 1 | 2 | 3 |
| 3 | 1 | 3 | 4 |
| 4 | 1 | 4 | 5 |
| 5 | 1 | 5 | 6 |
| 6 | 1 | 6 | 7 |
| 7 | 2 | 1 | 3 |
| 8 | 2 | 2 | 4 |
| 9 | 2 | 3 | 5 |
| 10 | 2 | 4 | 6 |
| 11 | 2 | 5 | 7 |
| 12 | 2 | 6 | 8 |
| 13 | 3 | 1 | 4 |
| 14 | 3 | 2 | 5 |
| 15 | 3 | 3 | 6 |
| 16 | 3 | 4 | 7 |
| 17 | 3 | 5 | 8 |
| 18 | 3 | 6 | 9 |
| 19 | 4 | 1 | 5 |
| 20 | 4 | 2 | 6 |
| 21 | 4 | 3 | 7 |
| 22 | 4 | 4 | 8 |
| 23 | 4 | 5 | 9 |
| 24 | 4 | 6 | 10 |
?具體代碼如下,可以分為從前往后處理,和分后往前處理兩種情況
'Public Parameter Public Out(), mOut, nOut '輸出數組 Public Nums%, Sides% '骰子數,點數 Public Org() '多維數組 Public arr '臨時變量Sub Roll_Dice_2() Dim i&, j& Nums = 5 '骰子數量 Sides = 7 '骰子點數 ReDim Org(1 To Nums) ReDim Out(1 To Sides ^ Nums, 1 To Nums) '輸出數組 ReDim arr(1 To Nums) '臨時數組 ReDim brr(1 To Sides) '序列數組 For j = 1 To Sidesbrr(j) = j '點數 Next j For i = 1 To NumsOrg(i) = brr '將一維數組并入,產生多維數組 Next i Dice_Combine_Recursion_Back 1, 1, Sides '從后往前循環 Dice_Combine_Recursion_Front Nums, 1, Sides '從前往后循環 Sheets("NxSides").Cells(2, 11).Resize(UBound(Out), UBound(Out, 2)) = Out End Sub'從后往前循環 'm表示骰子數 'k表示點數 Sub Dice_Combine_Recursion_Back(m, n, k) Dim i, j '變量 For i = n To k '循環點數arr(m) = Org(m)(i) '數據寫入If m < Nums ThenDice_Combine_Recursion_Back m + 1, n, kElseArr_In_Out arr '輸出結果End If Next i End Sub'從前往后循環 'm表示骰子數 'k表示點數 Sub Dice_Combine_Recursion_Front(m, n, k) Dim i, j '變量 For i = n To k '循環點數arr(m) = Org(m)(i) '數據寫入If m > 1 ThenDice_Combine_Recursion_Front m - 1, n, kElseArr_In_Out arr '輸出結果End If Next i End Sub'臨時數組寫入輸出數組 Sub Arr_In_Out(arr) nOut = nOut + 1 For mOut = 1 To UBound(arr)Out(nOut, mOut) = arr(mOut) Next End Sub下圖是用遞歸計算的5個骰子,7個點面的分布情況。
具體文件可以從網盤下載
http://pan.baidu.com/s/1c10zH9u
?
轉載于:https://my.oschina.net/tedzheng/blog/1549404
總結
- 上一篇: 楚留香2.0版本捏脸数据(汉典楚字的基本
- 下一篇: 东数西算一体化算力服务平台正式上线运营,