python3 实现约瑟夫环

Python019

python3 实现约瑟夫环,第1张

#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)

计算结果

killed: 3

killed: 7

killed: 2

killed: 10

killed: 1

killed: 6

killed: 8

killed: 9

killed: 4

survive: 5

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)