1

我将如何使用递归来计算用给定数量的骰子滚动某个数字 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));
     }
4

1 回答 1

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)

这意味着您必须从 tor-6循环r-1

而且由于您要对多个递归调用求和,因此您必须使用初始化为 0 的累加器。(我调用的变量sum

编辑:单击此处查看完整示例,与WolframAlpha进行比较以验证结果。

于 2013-04-25T07:09:25.843 回答