如何在python中递归地写这个总和?

时间:2013-02-20 22:43:54

标签: python recursion for-loop sum

如何在python中递归地编写这个函数:My Question(第一个答案)?这就是我到目前为止所做的:

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= 1 JF(某物,与,N,d,K,T ...) 基本案例是其他的东西。我怎么知道这个?请帮忙。谢谢。“

我得到的答案是:

关闭我的评论,如果我们添加一个参数p作为顶级模具而不是当前的顶部k(并丢弃d,因为所有骰子都是6面反正),那么我相信我们得到以下内容: F(N,P,K,T)=ΣP'=16Σi=16136⋅f第(n-1,P',K-1,叔(最大(P',I))) 变量i代表抛出下一个模具的结果。

我不知道这是否正确。我刚刚接受了这个问题,想要了解它。这就是我想出来的。

总和15的最终概率将是 σp值为= 16F(5,P,3,15) 在n = 3,k = 1的递归基本情况下。

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

我没有复制它的原因是因为sigma符号和LaTeX的碎片不会出现在stackoverflow中。

1 个答案:

答案 0 :(得分:1)

你只是混在一起。

For循环与生成器表达式

For loop:

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))