我将如何在 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 中。