约瑟夫问题

约瑟夫问题:
约瑟夫游戏的大意:30个游客同乘一条船,因为严重超载, 加上风浪大作,危险万分。因此船长告诉乘客,只有将全船 一半的旅客投入海中,其余人才能幸免于难。无奈,大家只 得同意这种办法,并议定30 个人围成一圈,由第一个人数起,依次报数,数到第9人,便把他投入大海中,然后再从 他的下一个人数起,数到第9人,再将他投入大海中,如此 循环地进行,直到剩下 15 个游客为止。问:哪些位置是将 被扔下大海的位置?
递归解法:
大致思路,假设简化成10人
初始情况为:

0 1 2 3 4 5 6 7 8 9

扔下去一个之后:

0 1 2 4 5 6 7 8 9
假如让剩下的人重新组成环,为了消除原编号3的空位影响,按照,新编号=(旧编号-最大报数)%旧人数,重新编号。

原始 0 1 2 3 4 5 6 7 8 9

旧环 0 1 2 4 5 6 7 8 9

新环 6 7 8 0 1 2 3 4 5
这样就解决了新环在数学上的不连续性
同时旧编号=(新编号+最大报数值)%旧人数
由于最开始的淘汰的编号是容易知道的,而每一轮的编号是可以由上一轮淘汰的编号得到的,所以可以用递归的思想,回溯到第一轮,再推出下一轮的编号。
伪代码:
int ysfdg(int sum,int value,int n)
{
if(n==1)
return (sum+value-1)%sum;
else
return (ysfdg(sum-1,value,n-1)+value)%sum;}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值