约瑟夫问题-猴子选大王问题php实现

约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3,1。

一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。用程序模拟该过程。

function mk($n ,$m){
        $arr = range(1,$n);//构造一个数组
        $i = 1; //从第一个开始循环
        while(count($arr)>1){ //如果总数大于1
            ($i % $m != 0) && array_push($arr,$arr[$i-1]);//不被踢出则压入数组尾部
            unset($arr[$i-1]);//压入数组然后删除
            $i++;//继续循环
        }  
        return $arr[$i-1]; //直至最后剩下一个为大王 
}
print_r(mk(6,8));   //第3只为大王
function mk($n, $m) {
        $arr = range(1, $n); 
        $i = 0;    
        while (count($arr) > 1) {   
           //遍历数组,判断当前猴子是否为出局序号,如果是则出局,否则放到数组最后
            (($i + 1) % $m != 0) &&  array_push($arr, $arr[$i]);   
            unset($arr[$i]);    
            $i++;  
        } 
        return $arr[$i];
    }
    print_r(mk(6,8));   //第3只为大王
//约瑟夫问题
    public function getJoseph($n, $m) {
        $tail = $this->header;
        while ( $tail->next != $this->header ) {
            $tail = $tail->next;
        }
        //从第几个人开始数
        for($i = 1; $i < $n; $i ++) {
            $this->header = $this->header->next;
            $tail = $tail->next;
        }
        //是否是最后一个节点
        while ( $tail != $this->header ) {
            for($i = 0; $i < $m-1; $i ++) {
                $this->header = $this->header->next;
                $tail = $tail->next;
            }
            $this->header = $this->header->next;
            $tail->next = $this->header;
        }
        return $tail;

python代码

# -*- coding: utf-8 -*- 
class Node(object):
    def __init__(self, value):
        self.value = value 
        self.next = None

def create_linkList(n):
    head = Node(1)
    pre = head
    for i in range(2, n+1):
        newNode = Node(i)
        pre.next= newNode
        pre = newNode
    pre.next = head
    return head

n = 5 #总的个数
m = 2 #数的数目
if m == 1: #如果是1的话,特殊处理,直接输出
    print (n)  
else:
    head = create_linkList(n)
    pre = None
    cur = head
    while cur.next != cur: #终止条件是节点的下一个节点指向本身
        for i in range(m-1):
            pre =  cur
            cur = cur.next
        print (cur.value)
        pre.next = cur.next
        cur.next = None
        cur = pre.next
    print (cur.value)

参考:jianshu.com/p/77223d2a9eef

https://zh.wikipedia.org/wiki/%E7%BA%A6%E7%91%9F%E5%A4%AB%E6%96%AF%E9%97%AE%E9%A2%98

原文地址:https://www.cnblogs.com/kumufengchun/p/12176435.html