约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。(从X度百科拷过来滴)
下面是我的两种实现方式,一种是函数,一种是面向对象。我的python用的3.3,所以print函数跟2.*不太一样。如不欢迎,敬请拍砖。
思路主要是通过%来计算数组下标,并pop指定位置的数组元素。while循环执行次数为数组长度。
Code list:
class Joseph(object):
n = 0
k = 0
m = 0
def __init__(self, n, k, m):
self.n = n
self.k = k
self.m = m
self.__lst = list(range(n))
def p_list(self):
print(self.__lst)
def kill(self):
offset = self.k
print(self.__lst)
while len(self.__lst) > 0:
death = (offset + self.m) % len(self.__lst)
print('='*90)
self.__lst.pop(death)
print(self.__lst)
offset = death
def jo_fun(n, k, m):
offset = k
lst = list(range(n))
print(lst)
while len(lst) > 0:
death = (offset + m) % len(lst)
print('='*50)
print('startwith: %d, kill %d, interval: %d' % (lst[offset], lst[death], m))
lst.pop(death)
print(lst)
offset = death
if __name__ == "__main__":
#jo = Joseph(15, 2, 3)
#jo.kill()
jo_fun(15, 2, 3)
运行结果展示如下:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
==================================================
startwith: 2, kill 5, interval: 3
[0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11, 12, 13, 14]
==================================================
startwith: 6, kill 9, interval: 3
[0, 1, 2, 3, 4, 6, 7, 8, 10, 11, 12, 13, 14]
==================================================
startwith: 10, kill 13, interval: 3
[0, 1, 2, 3, 4, 6, 7, 8, 10, 11, 12, 14]
==================================================
startwith: 14, kill 2, interval: 3
[0, 1, 3, 4, 6, 7, 8, 10, 11, 12, 14]
==================================================
startwith: 3, kill 7, interval: 3
[0, 1, 3, 4, 6, 8, 10, 11, 12, 14]
==================================================
startwith: 8, kill 12, interval: 3
[0, 1, 3, 4, 6, 8, 10, 11, 14]
==================================================
startwith: 14, kill 3, interval: 3
[0, 1, 4, 6, 8, 10, 11, 14]
==================================================
startwith: 4, kill 10, interval: 3
[0, 1, 4, 6, 8, 11, 14]
==================================================
startwith: 11, kill 1, interval: 3
[0, 4, 6, 8, 11, 14]
==================================================
startwith: 4, kill 11, interval: 3
[0, 4, 6, 8, 14]
==================================================
startwith: 14, kill 6, interval: 3
[0, 4, 8, 14]
==================================================
startwith: 8, kill 4, interval: 3
[0, 8, 14]
==================================================
startwith: 8, kill 8, interval: 3
[0, 14]
==================================================
startwith: 14, kill 0, interval: 3
[14]
==================================================
startwith: 14, kill 14, interval: 3
[]