我的第一步是递归和动态规划,并且有一个关于形成子问题来建模递归的问题。
问题:
有多少种不同的方式来抛一个公平的硬币5次,而不是有三个或更多的头在一起?
如果有些人能提供一些注释较多的代码(Ruby更喜欢但不是必需的)来帮助我实现这个目标。我不是一个学生,如果这重要,这是一个修改的Euler项目问题,使它非常简单的我掌握。我只需要掌握编写递归公式的诀窍。
如果你想把这个问题抽象成有多少种不同的方法来抛出一个公平的硬币Y倍,而没有Z或更多的头在一列,这也可能是有益的。再次感谢,这个网站太棒了。
发布于 2009-03-20 20:48:27
您可以简单地为此创建一个公式:
将硬币抛5次而不连续3个头的方法数等于5枚硬币翻转减去一排至少3个头组合的组合数。在这种情况下:
HHH-- (4 combinations)
THHH- (2 combinations)
TTHHH (1 combination)组合总数= 2^5 = 32。32 -7= 25。
如果我们连续抛硬币N次而没有Q头,则总金额为2^N,而至少Q头数为2^(N+1)-1。因此,一般的答案是:
Flip(N,Q) = 2^N - 2^(N-Q+1) +1当然,您可以使用递归来模拟总量:
flipme: N x N -> N
flipme(flipsleft, maxhead) = flip(flipsleft, maxhead, 0)
flip: N x N x N -> N
flip(flipsleft, maxhead, headcount) ==
if flipsleft <= 0 then 0
else if maxhead<=headcount then 0
else
flip(flipsleft - 1, maxhead, headcount+1) + // head
flip(flipsleft - 1, maxhead, maxhead) // tail https://stackoverflow.com/questions/667850
复制相似问题