在古羅馬時期,猶太人背叛了羅馬人,落到困境,約瑟夫和同行的一共39個猶太人只可以自殺殉國,可是猶太教義規定不能自殺,所以只可以讓別人將本身殺害。他們全部39我的坐成一圈,報數1—7,報到7則由身旁的人將本身殺死。結果約瑟夫靈機一動,給本身安排了一個位置,最後活了下來,那麼約瑟夫給本身安排的是哪個位置呢?app
在這個題目當中,咱們若是使用隊列,不只能夠處理任意人數坐成一圈,還能夠將報數的值任意修改,最後均可以找到那一個不被殺死的人的位置。咱們能夠將全部人都放進一個大的隊列裏,每報一次數字,那麼就把隊列頭部的人放到隊列的尾部,直到報數報到一組數字的最後一個,好比1——7當中的7。這個時候就將隊列頭的這我的刪除(也就是殺死),不斷執行這個過程,直到整個隊列當中的人數只有一個,則跳出循環返回最後活着的那我的的名字。spa
首先定義隊列(Queue)類的結構:code
class Queue(): def __init__(self): # 初始化一個空的列表 self.__list=[] # 往隊列裏插入元素 def enqueue(self,item): self.__list.append(item) # 彈出隊列裏的元素 def dequeue(self): return self.__list.pop(0)# 彈出隊列裏最早進入的元素 # 判斷隊列是否爲空 def is_empty(self): return self.__list == [] # 計算隊列的大小 def size(self): return len(self.__list)
使用隊列類來初始化一個對象,sim_queue,而後編寫剛纔咱們分析以後的程序:對象
def hot_potato(namelist,num): sim_queue = Queue() for name in namelist: sim_queue.enqueue(name) # 把拿到的名字所有都放到隊列裏 while sim_queue.size() > 1: for i in range(num): sim_queue.enqueue(sim_queue.dequeue()) # 每執行完一次,就將隊列的頭拿出來彈出,至關於土豆傳遞給這我的,而後這我的就死了 last_person=sim_queue.dequeue() return last_person print("開始執行約瑟夫問題") print(hot_potato(["bob","NAni","Ao li Gei!","HeHe","Mike","Suvennia"],4))
輸出:blog
開始執行約瑟夫問題
Ao li Gei!
得解,所以Ao li Gei!這我的不會被殺死。隊列