如何在Python中递归地编写这个求和?
我想用递归的方式在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(某些东西,与,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上显示不出来。
1 个回答
1
你只是把一些部分搞混了。
for循环和生成器表达式
for循环:
for p in range(1, 7):
statement()
生成器表达式:
expression() for p in range(1, 7)
注意,这里没有冒号,而且值是在for
之前。
if语句和条件表达式
if语句:
if predicate():
true_stmt()
else:
false_stmt()
if表达式:
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))