首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >简单递归问题

简单递归问题
EN

Stack Overflow用户
提问于 2009-03-20 20:27:36
回答 6查看 2.8K关注 0票数 0

我的第一步是递归和动态规划,并且有一个关于形成子问题来建模递归的问题。

问题:

有多少种不同的方式来抛一个公平的硬币5次,而不是有三个或更多的头在一起?

如果有些人能提供一些注释较多的代码(Ruby更喜欢但不是必需的)来帮助我实现这个目标。我不是一个学生,如果这重要,这是一个修改的Euler项目问题,使它非常简单的我掌握。我只需要掌握编写递归公式的诀窍。

如果你想把这个问题抽象成有多少种不同的方法来抛出一个公平的硬币Y倍,而没有Z或更多的头在一列,这也可能是有益的。再次感谢,这个网站太棒了。

EN

Stack Overflow用户

发布于 2009-03-20 20:48:27

您可以简单地为此创建一个公式:

将硬币抛5次而不连续3个头的方法数等于5枚硬币翻转减去一排至少3个头组合的组合数。在这种情况下:

代码语言:javascript
运行
复制
HHH-- (4 combinations)
THHH- (2 combinations)
TTHHH (1 combination)

组合总数= 2^5 = 32。32 -7= 25。

如果我们连续抛硬币N次而没有Q头,则总金额为2^N,而至少Q头数为2^(N+1)-1。因此,一般的答案是:

代码语言:javascript
运行
复制
Flip(N,Q) = 2^N - 2^(N-Q+1) +1

当然,您可以使用递归来模拟总量:

代码语言:javascript
运行
复制
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  
票数 6
EN
查看全部 6 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/667850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档