0

我将如何在 python 中递归地编写这个函数:我的问题(第一个答案)?这是我到目前为止所拥有的:

def f(n, p, k, t):
    sum(for p in xrange(1, 7):
        sum(for i in xrange(1,7):
                if n == 3: return 1
                if k == 1: return 0
                return (1/36) * f(n-1,p,k-1,t-max(p,i))
            )
        )

print sum([f(5,j,3,15) for j in xrange(1, 7)])

任何帮助表示赞赏,谢谢!:D

编辑:链接中的问题是这样的:

“假设我有 5 (n)、6 面 (d) 普通骰子。我如何计算出有多少可能的掷骰,其中前 3 (k) 个数字掷出的数字等于 15 (t)?我使用诸如 f(n,d,k,t)=∑i=1jf(something,with,n,d,k,t...) 之类的递归来做到这一点,其中基本情况是别的东西。我怎么想这出来了?请帮忙。谢谢。

我得到的答案是:

离开我的评论,如果我们添加一个参数 p 是不在当前顶部 k 中的顶部骰子(并丢弃 d,因为无论如何所有骰子都是 6 面的),那么我相信我们会得到以下结果:f( n,p,k,t)=∑p′=16∑i=16136⋅f(n−1,p′,k−1,t−(max(p′,i))) 变量i代表结果下一个骰子被抛出。

我不知道这是否正确。我只是对这个问题很感兴趣,想试一试。这就是我想出的。

总和 15 的最终概率将是 ∑p=16f(5,p,3,15),递归基本情况为 n=3,k=1。

提出这样的递归背后的一般思想如下:您想知道到达状态 A 的概率。然后查看所有可以立即到达 A 的情况,并将到达这些状态的概率乘以从那个“前状态”到达 A。然后你总结所有的前状态。

我没有复制它的原因是因为 sigma 符号和 LaTeX 点点滴滴没有出现在 stackoverflow 中。

4

1 回答 1

1

你只是混杂了一些东西。

For 循环与生成器表达式

对于循环:

for p in range(1, 7):
    statement()

生成器表达式:

expression() for p in range(1, 7)

请注意,没有冒号,并且该值位于for.

If 语句与条件表达式

如果声明:

if predicate():
    true_stmt()
else:
    false_stmt()

如果表达式:

true_expr() if predicate() else false_expr()

把它放在一起

def f(n, p, k, t):
    return sum(sum(1 if n == 3 else
                   (0 if k == 1 else
                    (1/36) * f(n-1, p, k-1, t-max(p,i))))
                   for i in range(1, 7))
               for p in range(1, 7))
于 2013-02-20T22:47:53.173 回答