php約瑟夫問題如何解決

來源:互聯網
上載者:User

“約瑟夫環”是一個數學的應用問題:一群猴子排成一圈,按1,2,…,n依次編號。然後從第1隻開始數,數到第m只,把它踢出圈,從它後面再開始數, 再數到第m只,在把它踢出去…,如此不停的進行下去, 直到最後只剩下一隻猴子為止,那隻猴子就叫做大王。要求編程類比此過程,輸入m、n, 輸出最後那個大王的編號。

下面列出了三種用PHP來解決此問題的方法:

  1. 按邏輯依次去除

  2. 遞迴演算法

  3. 線性表應用

方法一,按照邏輯依次去除

function getKingMokey($n, $m)  {      $monkey[0] = 0;      //將1-n只猴子順序編號 入數組中    for($i= 1; $i<= $n; $i++)       {           $monkey[$i] = $i;      }      $len = count($monkey);      //迴圈遍曆數組元素(猴子編號)    for($i= 0; $i< $len; $i= $i)      {          $num = 0;          /*          * 遍曆$monkey數組,計算數組中值不為0的元素個數(剩餘猴子的個數)          * 賦值為$num,並擷取值不為0的元素的元素值         */        foreach($monkeyas$key => $value)           {              if($value == 0) continue;              $num++;              $values = $value;           }          //若只剩一隻猴子 則輸出該猴子編號(數組元素值) 並退出迴圈         if($num == 1)           {               return$values;              exit;           }          /*           * 若剩餘猴子數大於1($num > 1)           * 繼續程式          */        //將第$i只猴子踢出隊伍(相應數組位置元素值設為0)         $monkey[$i] = 0;          /*          * 擷取下一隻需要踢出隊伍的猴子編號          * 在$m值範圍內遍曆猴子 並設定$m的計數器          * 依次取下一猴子編號          * 若元素值為0,則該位置的猴子已被踢出隊伍          * 若不為0,繼續擷取下一猴子編號,且計數器加1          * 若取得的猴子編號大於數組個數          * 則從第0隻猴子開始遍曆(數組指標歸零) 步驟同上          * 直到計數器到達$m值 * 最後擷取的$i值即為下一隻需要踢出隊伍的猴子編號          */        //設定計數器         for($j= 1; $j<= $m; $j++)           {               //猴子編號加一,遍曆下一隻猴子             $i++;              //若該猴子未被踢出隊伍,擷取下一隻猴子編號             if($monkey[$i] > 0) continue;              //若元素值為0,則猴子已被踢出隊伍,進而迴圈取下一隻猴子編號             if($monkey[$i] == 0)               {                   //取下一隻猴子編號                 for($k= $i; $k< $len; $k++)                  {                       //值為0,編號加1                     if($monkey[$k] == 0) $i++;                      //否則,編號已取得,退出                     if($monkey[$k] > 0) break;                  }                }              //若編號大於猴子個數,則從第0隻猴子開始遍曆(數組指標歸零) 步驟同上             if($i == $len) $i = 0;              //同上步驟,擷取下一隻猴子編號            if($monkey[$i] == 0)               {                   for($k= $i; $k< $len; $k++)                   {                      if($monkey[$k] == 0) $i++;                      if($monkey[$k] > 0) break;                  }               }           }      }  }  //猴子個數 $n = 10;  //踢出隊伍的編號間隔值 $m = 3;  //調用猴王擷取函數echo getKingMokey($n, $m)."是猴王";  方法二,遞迴演算法[php] view plain copyfunction killMonkey($monkeys , $m , $current = 0){      $number = count($monkeys);      $num = 1;      if(count($monkeys) == 1){          echo$monkeys[0]."成為猴王了";          return;      }      else{          while($num++ < $m){              $current++ ;              $current = $current%$number;          }          echo$monkeys[$current]."的猴子被踢掉了<br/>";          array_splice($monkeys , $current , 1);          killMonkey($monkeys , $m , $current);      }  }  $monkeys = array(1 , 2 , 3 , 4 , 5 , 6 , 7, 8 , 9 , 10); //monkeys的編號$m = 3; //數到第幾隻猴子被踢出killMonkey($monkeys , $m);
    方法三,線性表應用
  1. function yuesefu($n,$m) {        $r=0;        for($i=2; $i<=$n; $i++) {          $r=($r+$m)%$i;        }      return$r+1;    }    echo yuesefu(10,3)."是猴王";
相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.