Python 约瑟夫环问题

问题原型:有 500 个小孩围成一圈,编号从 1 到 500 (n),从第一个开始报数:1,2,3,1,2,3,1,2,3,……每次报到 3 (m) 的小孩退出。问第 n 个被淘汰的小孩,在最开始 500 人里是的编号是几?

类似的问题被称为约瑟夫环问题。

约瑟夫环公式推导 :https://www.jianshu.com/p/6ee5c7b21333

第一种解法:

def josephus(n, k, index):
    p = 0
    count = 0
    people = list(range(1, n+1))
    while True:
        if len(people) == 1:
            break
        p = (p + k - 1) % len(people)
        print 'p=%d--len people=%d' % (p, len(people))
        count += 1
        if count == index:
            print (people[p])
            break
        print people[p]
        del people[p]

第二中解法:使用循环单链表

class LinkNode(object):
    def __init__(self, value):
        self.value = value
        self.next = None


# 创建循环链表
def create_cycle(total):
    head = LinkNode(1)
    prev = head
    index = 2
    while total - 1 > 0:
        curr = LinkNode(index)
        prev.next = curr
        prev = curr
        index += 1
        total -= 1
    curr.next = head
    return head

def run(total, m, count):
    node = create_cycle(total)
    while total > 0:
        node = node.next
        total -= 1
    prev = None
    start = 1
    index = start

    while node and node.next:
        if index == m:
            print ('pop:--%d' % node.value)
            prev.next = node.next
            node.next = None
            node = prev.next
            index = start

        else:
            prev = node
            node = node.next
            index += 1

 

转载于:https://my.oschina.net/zhxx/blog/3041966

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值