您可以简单地为此创建一个公式:
在没有连续3个头的情况下翻转硬币5次的方法的数量等于5个硬币翻转的组合的数量减去连续至少三个头的组合的数量.在这种情况下:
HHH-- (4 combinations)
THHH- (2 combinations)
TTHHH (1 combination)
Run Code Online (Sandbox Code Playgroud)
组合总数= 2 ^ 5 = 32.并且32 - 7 = 25.
如果我们连续N次掷硬币N次,则总量为2 ^ N且至少Q头的量为2 ^(N-Q + 1)-1.所以一般的答案是:
Flip(N,Q) = 2^N - 2^(N-Q+1) +1
Run Code Online (Sandbox Code Playgroud)
当然,您可以使用递归来模拟总量:
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
Run Code Online (Sandbox Code Playgroud)