我是Python的初学者......事实上,我是编程的初学者。 Python是我开始学习的第一种编程语言。
我收到了一个谜题,我喜欢通过写一个程序来解决这个问题(作为一种练习),但我无法解决。
谜题如下:
假设你有100个人,他们站成一个圆圈,每个人都有一个数字,第一个带有数字1,第二个带有数字2,......,等等结束于最后一个携带数字100的人...第一个被给予一把剑来杀死一个数量大于他的人1 ...这意味着他杀了2号...然后他把剑给了下一个3号的剑......而且这个过程一直持续到只剩下一个人活着!那个人是谁?
我试图手动解决它,结果证明答案是73 ...... 73号是活着的人!
但是,你知道如何编程吗?
感谢您的帮助!
答案 0 :(得分:0)
好的,这是一个有趣的问题,在我看来是使用pythons .pop函数的一个很好的借口。
circle = list(range(1,101))
#100 people numbered 1-100
while len(circle) > 1: #run this code as long as the circle has more than one person
print(str(circle[0]) + " kills " + str(circle[1]))
survivor = circle[0] #save the survivor to a variable
circle.pop(1) #remove the person killed from the list
circle.pop(0) #remove the person who survives from the list
#now the new start of the list is whoever is next in line
circle.append(survivor) #re-add the survivor to the list at the end
print(str(circle[0]) + "is the winner") #print out the survivor
这是有效的,因为圆圈的“开始”始终是圆圈[0],当两个人战斗时,赢家和输家都从列表中移除,使圆圈[0]无论谁是下一个。然后将获胜者重新添加到列表的末尾,将他放在后面
我添加了几行来打印圆圈的完整演变并将其上传到pastebin http://pastebin.com/raw/z6ghuqE3
答案 1 :(得分:-1)
显然你自己解决了......怎么样?你能让Python以同样的方式做到吗?
因为你这样做是为了学习,所以让我们想一些不同的事情
你怎么跟踪谁还活着? 你怎么知道何时停止杀人(这让我发笑)和 你打算如何传球?
为了让你走上正确的轨道,我建议用Google搜索"迭代Python和#34;或者" Python控制结构"
因为另一个答案提供了迭代方法在我的解决方案中,我将使用递归来解决问题,函数调用自身直到达到退出条件。
numPeople = 100
theCircle = list(range(1, numPeople + 1))
#Solve with recursion
def massacreRecursion(theCircle):
#Exit condition
if len(theCircle) == 2:
theCircle.pop(1) #kill the last victim so len(theCircle) == 1 is True
print(theCircle[0]) #Print the survivor
else:
theCircle.pop(1) #kill some poor pleb
theCircle.append( theCircle.pop( 0 )) #rotate the circle left 1 effectively passing the sword right
massacreRecursion(theCircle) #do it again and again and again...
#enter the recursion
massacreRecursion(theCircle)