COUNT?=?60??#?總?cè)藬?shù)
創(chuàng)新互聯(lián)建站是一家專注于網(wǎng)站設(shè)計(jì)、網(wǎng)站制作與策劃設(shè)計(jì),黃陂網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:黃陂等地區(qū)。黃陂做網(wǎng)站價(jià)格咨詢:028-86922220
INDEX_FIRST?=?2???#?第一次站出來的是2號(hào)
origin?=?list(range(1,?COUNT+1))
res?=?[]
index_label?=?INDEX_FIRST?-?1
index_temp?=?0
while?origin:
index_temp?=?(index_label?+?index_temp)?%?len(origin)
res.append(origin.pop(index_temp))
index_label?+=?1
print(res)
請(qǐng)點(diǎn)擊輸入圖片描述
#coding=GBK
class Node():
def __init__(self,value,next=None):
self.value = value
self.next = next
def createLink(n):
if n=0:
return False
elif n ==1:
return Node(1)
else:
root = Node(1)
tmp = root
for i in range(2,n+1):
tmp.next = Node(i)
tmp = tmp.next
tmp.next = root
return root
def showLink(root):
tmp = root
while True:
print(tmp.value)
tmp = tmp.next
if tmp ==None or tmp == root :
break
def josephus(n,k):
if k ==1 :
print("幸存者:",n)
return
root = createLink(n)
tmp = root
while True:
for i in range(k-2):
tmp = tmp.next
? ? print("killed:",tmp.next.value)
tmp.next = tmp.next.next
tmp = tmp.next
if tmp.next == tmp:
break
print("survive:",tmp.value)
if __name__ =='__main__':
josephus(10,13)
計(jì)算結(jié)果:
killed: 3
killed: 7
killed: 2
killed: 10
killed: 1
killed: 6
killed: 8
killed: 9
killed: 4
survive: 5
現(xiàn)在有13個(gè)人圍成一個(gè)環(huán),從1開始報(bào)數(shù),數(shù)到3的人離開,寫出程序計(jì)算最后剩下的是誰。
使用while循環(huán)
使用for循環(huán)
使用遞歸
摒棄遞歸,每次步長不為k時(shí)候都把當(dāng)前元素彈出并放到隊(duì)列尾部,從而模擬循環(huán)鏈表結(jié)構(gòu)。進(jìn)一步優(yōu)化,由于列表彈出第一個(gè)元素的復(fù)雜度較高,可以使用雙端隊(duì)列來進(jìn)行優(yōu)化:
30 個(gè)人在一條船上,超載,需要 15 人下船。
于是人們排成一隊(duì),排隊(duì)的位置即為他們的編號(hào)。
報(bào)數(shù),從 1 開始,數(shù)到 9 的人下船。
如此循環(huán),直到船上僅剩 15 人為止,問都有哪些編號(hào)的人下船了呢?
方法一:無算法運(yùn)算
方法二:算法隊(duì)列,利用隊(duì)列先進(jìn)先出的原理
queue模塊學(xué)習(xí)
基礎(chǔ)使用函數(shù)
q=queue.Queue(n) #建立長度為n的先進(jìn)先出隊(duì)列FIFO
q=q=queue.LifoQueue(n) #建立長度為n的后進(jìn)先出隊(duì)列LIFO
q.put() #放入元素
q.get() #取出元素
模塊其他函數(shù)
def josephus(n, m):
if type(n) != type(1) or n = 0:
raise Exception('n must be an integer(n 0)')
if n == 1:
return 0
else:
return (josephus(n - 1, m) + m) % n
if __name__ == '__main__':
print josephus(8, 3)
print josephus(1, 2)
print josephus(0, 2)