PHP算法趣談--猴子找大王

1、算法問題

將一羣猴子排成一圈,按照猴子數按照1,2,...,n依次編號。而後從第1只開始數,定義數m個猴子,以後將數到的猴子將它踢出圈,從它後面再開始數, 再數到第m只,在把它踢出去...,如此循環的進行下去,直到最後只剩下一隻猴子爲止,那隻猴子就是大王。php

clipboard.png

2、算法思想及來源

  • 遞歸函數
  • 子函數調用
  • 時間複雜度是O(n*m)

此算法問題來自於約瑟夫問題(來源維基百科)算法

3、算法原題

約瑟夫斯問題(有時也稱爲約瑟夫斯置換),是一個出如今計算機科學和數學中的問題。在計算機編程的算法中,相似問題又稱爲約瑟夫環。 有n個囚犯站成一個圓圈,準備處決。首先從一我的開始,越過 k-2我的(由於第一我的已經被越過),並殺掉第k我的。接着,再越過 k-1我的,並殺掉第k我的。這個過程沿着圓圈一直進行,直到最終只剩下一我的留下,這我的就能夠繼續活着。 問題是,給定了n和k,一開始要站在什麼地方纔能避免被處決?編程

4、算法設計與實現

<?php 
    //算法問題
    //
    function xdw($m, $n){
        //存猴子名稱
        $arr = array();

        //給猴子定義名稱
        $a = "a";
        for($i=0; $i<$m; $i++){
            $arr[] = $a++;
        }
        //print_r($arr);
        //定義猴子排序個數
        $j = 0;
        while (count($arr) > 1) {
            if($j%$n==0){
                unset($arr[$j]);
            }else{
                $arr[] = $arr[$j];
                unset($arr[$j]);
            }
            $j++;
        }
        return $arr;
    }
    print_r(xdw(40, 3));
 ?>
相關文章
相關標籤/搜索