约瑟夫问题

作者: Jiafu | 来源:发表于2017-09-29 14:50 被阅读7次

    题目:0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。

    定义函数f(n,m),表示每次在n个数字(0,1,...,n-1)中每次删除第m个数字后最后剩下的数字。

    在n个数字中,假设第一个被删除的数字为k,那么删除k之后剩下的n-1个数字为0~k-1,k 1~n-1,并且下一次删除从数字k 1开始计数。第二个序列最后剩下的数字也就是我们要求的数字。于是我们对于剩下的n-1个数字重新编号,k 1编号为0,k 2编号为1,...,0编号为n-k-1,1编号为n-k,k-1编号为n-2,假设f(n-1, m) = x,即n-1个数中,每次删除第m个,最后剩下的数字编号为x,那么这个x就对应着原序列(n个数)中的编号(x + m) % n。可以得到递推关系:
    f(n,m)=0, n=1
    f(n,m)=[f(n-1,m) + m]%n n>1

    Python代码:

    #coding=utf8
    '''
    题目:0,1,...,n-1这n个数字排成一个圆圈,从数字0开始每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
    '''
     
    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)
    

    相关文章

      网友评论

        本文标题:约瑟夫问题

        本文链接:https://www.haomeiwen.com/subject/nluiextx.html