约瑟夫环问题python解法_约瑟夫环问题python解法 | 学步园
约瑟夫环问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到k的那个人被杀掉;他的下一个人又从1开始报数,数到k的那个人又被杀掉;依此规律重复下去,直到圆桌周围的人只剩最后一个。
思路是:当k是1的时候,存活的是最后一个人,当k>=2的时候,构造一个n个元素的循环链表,然后依次杀掉第k个人,留下的最后一个是可以存活的人。代码如下:
class Node():
def __init__(self,value,next=None):
self.value=value
self.next=next
def createLink(n):
if n<=0:
return False
if n==1:
return Node(1)
else:
root=Node(1)
tmp=root
for i in range(2,n+1):
tmp.next=Node(i)
tmp=tmp.next
tmp.next=root
return root
def showLink(root):
tmp=root
while True:
print(tmp.value)
tmp=tmp.next
if tmp==None or tmp==root:
break
def josephus(n,k):
if k==1:
print('survive:',n)
return
root=createLink(n)
tmp=root
while True:
for i in range(k-2):
tmp=tmp.next
print('kill:',tmp.next.value)
tmp.next=tmp.next.next
tmp=tmp.next
if tmp.next==tmp:
break
print('survive:',tmp.value)
if __name__=='__main__':
josephus(10,4)
print('-----------------')
josephus(10,2)
print('-----------------')
josephus(10,1)
print('-----------------')
输出结果如下:
-------------------------------------分界线-----------------------------------------
感谢大家建议,第一种方法是直观暴力裸搞,确实不太简洁,下面写出我的第二种方法,求模来搞起,代码少了一些,如下:
def josephus(n,k):
if k==1:
print('survive:',n)
return
p=0
people=list(range(1,n+1))
while True:
if len(people)==1:
break
p=(p+(k-1))%len(people)
print('kill:',people[p])
del people[p]
print('survive:',people[0])
if __name__=='__main__':
josephus(10,4)
josephus(10,2)
josephus(10,1)
运行结果和上面一样。为了进一步对比性能,我用josephus(100000,4)测试,即n=100000,k=4。为了去掉IO消耗的时间干扰,把"kill:"的print注释掉,只输出最后的"survive:"结果,测试结果如下:
结果表明,第一种循环链表的方式比第二种取模运算的方式要快,由于比例不是线性的,不能说是几倍,而且这个测试和python内部实现有关,换作C语言O3优化后结果就不一定一样了,所以测试结果不能说明什么哈~
约瑟夫环问题python解法_约瑟夫环问题python解法 | 学步园相关推荐
- 紧凑存储的杜利特尔分解法Doolittle(LU分解法)_解线性方程组的直接解法
紧凑存储的杜利特尔分解法Doolittle(LU分解法)_解线性方程组的直接解法 标签:计算方法实验 /* 紧凑存储的杜利特尔分解法Doolittle:如果初始矩阵不要求保留的话,可以紧凑存储.因为每 ...
- pythoncookbook和流畅的python对比_为什么你学Python效率比别人慢?因为你没有这套完整的学习资料...
以下资源免费获取方式! 关注!转发!私信"资料"即可免费领取! 入门书籍 1.<Python基础教程>(Beginning Python From Novice to ...
- 零基础学python 视频_全网最全Python视频教程真正零基础学习Python视频教程 490集...
Python Web开发-进阶提升 490集超强Python视频教程 真正零基础学习Python视频教程 [课程简介] 这是一门Python Web开发进阶课程,手把手教你用Python开发完整的商业 ...
- 3 x 10的python表达式_这道数学题用PYTHON编程语言怎么写? 编程语言python是用
我觉着,这个应该这样解决比较符合计算机解题思路. 下面的回答的,思考的东西太多. # -*- coding: utf-8 -*- __author__ = 'lpe234' __date__ = '2 ...
- 为什么要学python语言_我们为什么要学习Python语言?
原标题:我们为什么要学习Python语言? 聊到我们为什么要学习Python语言?小编不禁又想起大佬潘石屹准备开启Python学习旅程时所发布的微博. 我们为什么要学习Python语言? 在农业社会时 ...
- 下载python步骤_下载及安装Python详细步骤
安装python分三个步骤: *下载python *安装python *检查是否安装成功 1.下载python (1)python下载地址 (2)选择下载的版本 (3)点开download后,找到下载 ...
- ubuntu更改默认python版本_更改Ubuntu默认python版本的方法
1.查看基本信息 # 列出所有已安装python ls /usr/bin/python* #查看默认的 Python 版本信息: python --version 2.基于用户修改 默认Python ...
- python编辑器_推荐一款Python编辑器,集Pycharm和Sublime优点于一身的王者
编程里面的编辑器就像是武林大会里面的高手,每一年都有新秀,黑马出现!比如有练习霸道的天罡之气的榜首Pycharm,力量雄厚霸道战斗力极强,但是对斗气消耗很大,占内存大而且启动速度有点慢!还有练习灵巧的 ...
- 人工智能只能用python吗_为什么人工智能用Python?
主要原因: 1.人工智能适应Python的编程语言. 2.人工智能需要利用Python的高层语言,实现可移植性.面向对象.可扩展性.可嵌入型等功能,来实现人机交流. Python:是一种面向对象的解释 ...
- 数据结构与算法python描述_数据结构与算法——Python语言描述.pdf
数据结构与算法--Python语言描述.pdf 欢迎加入非盈利Python编学习交流程QQ群783462347,群里免费提供500+本Python书籍! 欢迎加入非盈利Python编程学习交流程QQ群 ...
最新文章
- css怎么设置列表颜色,css怎么设置table颜色
- php和python交互-Python如何实现简单的用户交互程序(示例)
- 《Man Vs wild》 Notes-法国阿尔卑斯山
- BadI /ui2/catalog_provider_bd
- 写论文,这个神器不能少!
- 利用BenchmarkDotNet 测试 .Net Core API 同步和异步方法性能
- Spring MVC-集成(Integration)-集成LOG4J示例(转载实践)
- Springboot之actuator配置不当漏洞(autoconfig、configprops、beans、dump、env、health、info、mappings、metrics、trace)
- 3G应用需要所有的网友共同创造
- php macro,如何利用 macro 方法来扩展 Laravel 的基础类的功能
- maya 替换名称_maya替换对象,MAYA
- 帆软扩展后排序(超链排序)
- CSharp_DevExpress_DXperience_Universal_11.1.6 下载+源码+编译
- JAVA共享图片管理系统毕业设计 开题报告.
- 处理器管理及并发进程-多道程序设计
- 怎样往阿里云windows服务器传文件
- 极致cms精纺资源网的模板
- 慧荣SM3271AD芯片U盘量产
- 计算机正确的按键手法游戏,lol正确的按键手法图解
- linux中常见中英文单词对照表
热门文章
- MySQL内部临时表的具体使用
- 服装店如何做好终端销售数据分析?
- vue 3.0 rfc_Ultimate Developer PC 2.0-第2部分-构建WEI 7.9和RFC(用于构建GOM)的更新和PODCAST(上帝自己的计算机)...
- 一年级班主任的说话 - 『小学教育』 - 教育讨论区 - 教育手拉手论坛
- Android跨进程通信Binder机制与AIDL实例
- SQL 外键条件说明
- C# Grasshopper自定义电池图标
- 运用用setAttribute和getAttribute
- 2007年7月28日 - 高县雷雨露营记II
- VC++异常捕获__try...__except和try...catch的使用介绍(附源码)