约瑟夫环问题:已知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解法 | 学步园相关推荐

  1. 紧凑存储的杜利特尔分解法Doolittle(LU分解法)_解线性方程组的直接解法

    紧凑存储的杜利特尔分解法Doolittle(LU分解法)_解线性方程组的直接解法 标签:计算方法实验 /* 紧凑存储的杜利特尔分解法Doolittle:如果初始矩阵不要求保留的话,可以紧凑存储.因为每 ...

  2. pythoncookbook和流畅的python对比_为什么你学Python效率比别人慢?因为你没有这套完整的学习资料...

    以下资源免费获取方式! 关注!转发!私信"资料"即可免费领取! 入门书籍 1.<Python基础教程>(Beginning Python From Novice to ...

  3. 零基础学python 视频_全网最全Python视频教程真正零基础学习Python视频教程 490集...

    Python Web开发-进阶提升 490集超强Python视频教程 真正零基础学习Python视频教程 [课程简介] 这是一门Python Web开发进阶课程,手把手教你用Python开发完整的商业 ...

  4. 3 x 10的python表达式_这道数学题用PYTHON编程语言怎么写? 编程语言python是用

    我觉着,这个应该这样解决比较符合计算机解题思路. 下面的回答的,思考的东西太多. # -*- coding: utf-8 -*- __author__ = 'lpe234' __date__ = '2 ...

  5. 为什么要学python语言_我们为什么要学习Python语言?

    原标题:我们为什么要学习Python语言? 聊到我们为什么要学习Python语言?小编不禁又想起大佬潘石屹准备开启Python学习旅程时所发布的微博. 我们为什么要学习Python语言? 在农业社会时 ...

  6. 下载python步骤_下载及安装Python详细步骤

    安装python分三个步骤: *下载python *安装python *检查是否安装成功 1.下载python (1)python下载地址 (2)选择下载的版本 (3)点开download后,找到下载 ...

  7. ubuntu更改默认python版本_更改Ubuntu默认python版本的方法

    1.查看基本信息 # 列出所有已安装python ls /usr/bin/python* #查看默认的 Python 版本信息: python --version 2.基于用户修改 默认Python ...

  8. python编辑器_推荐一款Python编辑器,集Pycharm和Sublime优点于一身的王者

    编程里面的编辑器就像是武林大会里面的高手,每一年都有新秀,黑马出现!比如有练习霸道的天罡之气的榜首Pycharm,力量雄厚霸道战斗力极强,但是对斗气消耗很大,占内存大而且启动速度有点慢!还有练习灵巧的 ...

  9. 人工智能只能用python吗_为什么人工智能用Python?

    主要原因: 1.人工智能适应Python的编程语言. 2.人工智能需要利用Python的高层语言,实现可移植性.面向对象.可扩展性.可嵌入型等功能,来实现人机交流. Python:是一种面向对象的解释 ...

  10. 数据结构与算法python描述_数据结构与算法——Python语言描述.pdf

    数据结构与算法--Python语言描述.pdf 欢迎加入非盈利Python编学习交流程QQ群783462347,群里免费提供500+本Python书籍! 欢迎加入非盈利Python编程学习交流程QQ群 ...

最新文章

  1. css怎么设置列表颜色,css怎么设置table颜色
  2. php和python交互-Python如何实现简单的用户交互程序(示例)
  3. 《Man Vs wild》 Notes-法国阿尔卑斯山
  4. BadI /ui2/catalog_provider_bd
  5. 写论文,这个神器不能少!
  6. 利用BenchmarkDotNet 测试 .Net Core API 同步和异步方法性能
  7. Spring MVC-集成(Integration)-集成LOG4J示例(转载实践)
  8. Springboot之actuator配置不当漏洞(autoconfig、configprops、beans、dump、env、health、info、mappings、metrics、trace)
  9. 3G应用需要所有的网友共同创造
  10. php macro,如何利用 macro 方法来扩展 Laravel 的基础类的功能
  11. maya 替换名称_maya替换对象,MAYA
  12. 帆软扩展后排序(超链排序)
  13. CSharp_DevExpress_DXperience_Universal_11.1.6 下载+源码+编译
  14. JAVA共享图片管理系统毕业设计 开题报告.
  15. 处理器管理及并发进程-多道程序设计
  16. 怎样往阿里云windows服务器传文件
  17. 极致cms精纺资源网的模板
  18. 慧荣SM3271AD芯片U盘量产
  19. 计算机正确的按键手法游戏,lol正确的按键手法图解
  20. linux中常见中英文单词对照表

热门文章

  1. MySQL内部临时表的具体使用
  2. 服装店如何做好终端销售数据分析?
  3. vue 3.0 rfc_Ultimate Developer PC 2.0-第2部分-构建WEI 7.9和RFC(用于构建GOM)的更新和PODCAST(上帝自己的计算机)...
  4. 一年级班主任的说话 - 『小学教育』 - 教育讨论区 - 教育手拉手论坛
  5. Android跨进程通信Binder机制与AIDL实例
  6. SQL 外键条件说明
  7. C# Grasshopper自定义电池图标
  8. 运用用setAttribute和getAttribute
  9. 2007年7月28日 - 高县雷雨露营记II
  10. VC++异常捕获__try...__except和try...catch的使用介绍(附源码)