实验三大步骤:一立Flag,二百度,三动手,四发朋友圈。
问题
东罗马帝国,里奥二世曾今让64名死刑犯站成一个圈,隔一个杀一个,杀到剩下一个为止。并让所有死刑犯自己争抢位置,如果你是死刑犯的一员,你要挑什么位置呢?
对N问题
问题一般化:包含N个节点(节点编号1-N)的圆,隔一个节点从中摘除一个节点,直到只剩下一个节点为止。求剩下节点的编号。
问题特殊化:应当从N=1,...,10开始逐步研究起,以求得规律,此处改为一律用程序实现
代码如下:
#0=live 1=death
def f(n):
li=[0]*n
i=0
death=0
while True:
#如果活的杀死他,并隔一个指向下一个位置
if li[i]==0:
li[i]=1
death=death+1
if death==n-1:
break
i=(i+2 if i+2<n else i+2-n)
#如果死的,不进行操作
elif li[i]==1:
i=(i+1 if i+1<n else i+1-n)
for i in range(n):
if li[i]==0:
print(i+1)#0对应1
return
for i in range(2,101):
f(i)
结果如图:
猜测规律:N人参加的排队杀人游戏,如果N为偶数,存活者为N,如果为奇数,存活者为N-1。进一步升华总结到,队伍中最大的偶数角色会存活。
归纳法证明规律:
1.k=2,3时,存活者编号分别为2,2,符合规律
2.假设k=N时成立,首轮收割后,奇数者死去,偶数者的队尾仍旧在队尾。N->N-1**有问题还,等待有志者协同证明