• 约瑟夫问题-猴子选大王问题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

  • 相关阅读:
    es6 --- var const let
    HTTP -- 请求/响应 结构
    点击下载文件
    计算机当前时间
    js -- img 随着鼠标滚轮的变化变化
    vue --- 全局守卫
    vue -- 路由懒加载
    vuex -- 状态管理
    js对数组进行操作
    高性能网站建设
  • 原文地址:https://www.cnblogs.com/kumufengchun/p/12176435.html
Copyright © 2020-2023  润新知