约瑟夫环问题——Python实现

【问题描述】

  已知n个人(以编号1,2,3…n分别表示)围坐成一圈。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人将被kill;依此规律重复下去,直到剩下一人。

【分析问题】

  • 先用1-n给这n个人进行编号,存储在一个list列表中
  • 从的一个人(list头部)开始数数,有数到非m和数到m两种情况
  • 数到非m:将这个人加入到list尾部,下一个人报数+1
  • 数到m:将这个人杀死(弹出列表),下一个人重新从1开始报数

【代码实现】

def play(man, sep, rest):
	"""
	Arguments:
		man {[int]} -- [初始总人数]
		sep {[int]} -- [报数报到sep的人被kill]
		rest {[int]} -- [最终的幸存者数]
	"""

	man = [i for i in range(1, man+1)]
	number = 1
	while len(man) > rest:
		if number == sep:
			print("kill", man[0])
			man.pop(0)
			number = 1
		else:
			item = man.pop(0)
			man.append(item)
			number = number + 1
	print("The survivors are: ", man)

if __name__ == '__main__':
	play(8, 3, 1)

【输出结果】

kill 3
kill 6
kill 1
kill 5
kill 2
kill 8
kill 4
The survivors are: [7]
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页