1. 程式人生 > >線性表應用--Josephus問題的解法(Python 版)

線性表應用--Josephus問題的解法(Python 版)

pytho 人的 clas 基於 列表 設有 return 所有 下一個

線性表應用

--Josephus問題的解法(Python 版)

Josephus問題描述:假設有n個人圍坐一圈,現在要求從第k個人開始報數,報到第m個數的人退出。然後從下一個人開始繼續報數並按照相同的規則退出,直到所有人退出。要求按順序輸各出列人的編號。  

  1. 基於數組概念解法

    1. 建立一個包含n個人的表
    2. 找到第k個人,從那裏開始
    3. 處理過程中采用吧相應元素修改為0的方式表示已經退出,反復做:
    4. 數m個(尚在坐的)人,遇到表的末端轉回到下標0繼續
    4. 把表示第m個人的表元素修改為0
    5. n個人出列表示結束

     1 def josephus(n,k,m):
    
    2 people = list(range(1,n+1)) # 初始化,序列標號 1,2,3,...,n 3 i = k - 1 # i 記錄了第k個人的下標 4 for num in range(n): # 循環n次 5 count = 0 6 while count < m : 7 if people[i] > 0: # 跳過 已經退出的人 8 count += 1 9 if count == m : # 這裏註意: i還沒+1
    10 print(people[i], end="") 11 people[i] = 0 12 i = (i + 1) % n # 控制 i 的循環 13 if num < n + 1 : 14 print(", ",end="") 15 else : 16 print("")
  2. 基於順序表的解法 

    利用列表的性質,彈出報數為m的人

    1 # 利用列表的性質,彈出報數為m的人
    2 
    3 def josephus_L(n,k,m):
    
    4 people = list(range(1,n+1)) 5 num , i = n , k-1 6 for num in range(n,0,-1): 7 i = (i + m - 1) % num # 報數m的人的下標 8 print(people.pop(i),end="") # 報數第m個數的人彈出後 i 自動指向下一個 9 return
  3. 基於循環單鏈表的解法


線性表應用--Josephus問題的解法(Python 版)