求解报数游戏(约瑟夫环)的六种方法原理与Python实现源码

董付国老师Python系列教材推荐与选用参考

开学第一课:一定不要这样问老师Python问题

3000道Python习题免费在线练习

“Python小屋”1300篇历史文章分类速查表

董付国老师Python教学PPT汇总与题库分享

==============

版权声明:由于公众号后台规则问题,本文暂时无法设置原创标记,但仍属原创内容,微信公众号“Python小屋”坚持只发原创技术文章。

=============

推荐教材:

董付国编著.Python程序设计(第3版),ISBN:9787302550839,清华大学出版社,2020年6月出版,2023年12月第16次印刷(本书前两版印刷18次,已退出历史舞台),定价59.8元,山东省普通高等教育一流教材,山东省一流本科课程“Python应用开发”配套教材,2019、2020、2021、2022、2023年清华大学出版社畅销教材

6ca0f1006438819dbf7966ba946587f0.jpeg

图书详情:fac538e82cbc3fb456e5f0cfbaed7a66.png

图书内容:148个例题、124节微课视频(含课程思政),内容涉及Python基础、Office文件操作、GUI、图像处理、计算机图形学、音视频处理、数据分析与科学计算可视化、密码学、数据库、网络编程、多线程与多进程、逆向工程、Windows系统编程与安卓编程等领域。

页数:381

适用专业:计算机类所有专业

适用层次:研究生/本科/专科

配套资源:教学大纲、电子教案、课件、源码、数据文件、习题答案、题库,在线练习软件,支持课程思政,支持工程教育认证

适用学时:64/96/128

京东购买链接:https://item.jd.com/12668739.html

=============

问题描述:

有n个人围成一圈,按顺时针顺序编号,从第一个人开始从1到k(例如k=3)报数,报到k的人退出圈子,圈子缩小,从下一个人继续游戏从1到k报数,问最后留下的一个人的编号是什么。

下图演示了n=8和k=3的游戏过程,右上角的箭头表示顺时针报数,同心圆从外向内表示人数越来越少、圈越来越小,圆上的数字表示人的编号,斜线表示当前编号的人出圈,浅色背景表示下一个开始报数的人。最内圈深色背景的数字7表示最后剩下的一个人的编号。

2c6e1817897722dc56c589f85dd2f0d9.png

下面函数func1()的思路是使用列表来模拟环,每次第一个人报数之后如果不是k就移动到列表尾部,否则就出圈不再回到列表中。由于列表在删除和插入元素时自动收缩和扩展内存的特点导致大量元素移动,这些开销会影响效率。

59bbfa7c276d16fc2a117e116a6b6962.png

下面函数func2()的思路是使用标准库itertools中的cycle类把列表转换为环,避免了频繁的元素移动,但每次有人出圈时的切片和列表连接操作开销也很大,效率提升不明显。

62de3e5abd69fdb56e7c05e376713cde.png

下面函数func3()的思路是使用求余运算来模拟环,同时直接定位要出圈的人,减少了大量元素移动且避免了列表连接操作,效率提升非常明显。

17668c8c64cc19ed726b63bb662faed4.png

下面代码使用面向对象程序设计自定义了循环链表来模拟环,使用节点删除操作来避免元素移动带来的开销,但循环链表的节点遍历操作耗时比列表下标计算要大。

e6ae3aef6424f6e13acd49820343db3e.png

cdff57351f4ea990a8c1afee4eed9a0b.png

e7532beefd556a160a1c7845a006cb9f.png

下面的代码用于测试上面的6种方法的功能和性能。

f1698e50d702fb0b98eedbceffbe1cd4.png

运行结果为:

964ec1a3a1726f8246eea8a993ba9c49.png

=================

温馨提示:

关注微信公众号“Python小屋”,在公众号后台发送消息“大事记”可以查看董付国老师与Python有关的重要事件;发送消息“教材”可以查看董付国老师出版的Python系列教材(已累计印刷超过200次)的适用专业详情;发送消息“历史文章”可以查看董付国老师推送的超过1300篇原创技术文章;发送消息“会议”可以查看近期董付国老师的培训安排;发送消息“微课”可以查看董付国老师免费分享的超过700节Python微课视频;发送消息“课件”可以查看董付国老师免费分享的Python教学资源;发送消息“小屋刷题”可以下载“Python小屋刷题神器”,免费练习3857道客观题和759道编程题,题库持续更新;发送消息“编程比赛”了解Python小屋编程大赛详情。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值