如何使用递归来计算使用给定数量的骰子滚动某个数字r的概率?我试图将此视为一个选择问题,但我仍然对算法应如何工作感到困惑。
例如,它应该是这样的:
P(4,14)=(1/6)P(3,13)+(1/6)P(3,12)+(1/6)P(3,11)+(1/6 )p(3,10)+(1/6)p(3,9)+(1/6)p(3,8)
P(3,8)=(1/6)P(2,7)+(1/6)P(2,6)+(1/6)P(2,5)+(1/6 )P(2,4)+(1/6)P(2,3)+(1/6)P(2,2)
P(2,4)=(1/6)P(1,3)+(1/6)P(1,2)+(1/6)P(1,1)+(1/6 )p(1,0)+(1/6)p(1,-1)+(1/6)p(1,-2)
=(1/6)(1/6)+(1/6)(1/6)+(1/6)(1/6)+(1/6)(0)+(1/6 )(0)+(1/6)(0)
我在将其转换为代码时遇到了麻烦。
static double P(int dice, int r) {
int ret = 1;
for (int i = 2; i < 7; i++) {
ret = (1/6)(ret*(dice-i))/(i+1);
}
return ret;
}
static double RollDice(int dice,int r) {
if (dice==1 && (r<1 || r>6)){
return 0;
}
if (dice==1 && (r>=1 && r<=6)){
return (1.0/6);
}
else {
return ((1.0/6)*P(dice-1,r-1));
}
答案 0 :(得分:1)
我不明白为什么你必须将方法P()
和RollDice()
分开,因为在你的公式中,你(正确地)用P
来描述所有方法。
如果您要将公式放入代码中,它应该如下所示:
编辑:将基本案例更改为0骰子,从那时起变得更加简单。
static double P(int dice, int r) {
if (dice == 0) {
// Zero dice: probabiliy 1 to get 0
if (r == 0) {
return 1.0;
} else {
return 0.0;
}
else {
// Multiple dice: recursion
double sum = 0.0;
for (/* TODO */) {
sum += //TODO
}
}
}
对于递归部分,请尝试查看公式:
P(4, 14) = (1/6)P(3, 13) + (1/6)P(3, 12) + ... + (1/6)P(3, 8)
即。在一般情况下
P(dice, r)=(1/6)P(dice-1, r-1) + (1/6)P(dice-1, r-2) + ... + (1/6)P(dice-1, r-6)
意味着您必须从r-6
循环到r-1
。
由于你在多个递归调用上得到了一个总和,你必须使用一个初始化为0的累加器。(我调用的变量sum
)
编辑:点击here获取完整示例,与WolframAlpha进行比较以验证结果。