Python之约瑟夫环

约瑟夫环是一个数学的应用问题:已知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
[]


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值