代码改变世界

python解约瑟夫环问题

2014-08-23 13:57  luxr123  阅读(561)  评论(0编辑  收藏  举报

故事:

约瑟夫问题(Josephus Problem)据说著名犹太历史学家 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被敌人到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。
然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

 

原题:

用户输入M,N值,N个人围成一个环,从0号人开始数,数到M,那个人就退出游戏,直到最后一个人
求最后一个剩下的人是几号?
(约瑟夫环问题 Josephus)

首先是比较容易看得懂的。。

Python代码
  1. def Josephus(n,m):  
  2.     #自动身成列表,从0开始 到n-1  
  3.     people = list(range(n))  
  4.     m-=1  
  5.     k=m%n;  
  6.     while(len(people ) >1):  
  7.         del list[k]  
  8.         k= (k+m) % len(people )  
  9.     return people [0]  

说实话,感觉还是因为python的数据结构强大,list del掉自动补位,其他语言估计要费力些