PHP 經典趣味演算法 (學習函式)

三杯兩盞石酒發表於2019-08-28

約瑟夫環

1、一群猴子排成一圈,按1,2,…,n依次編號。然後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數,再數到第m只,在把它踢出去…,如此不停的進行下去,直到最後只剩下一隻猴子為止,那隻猴子就叫做大王。要求程式設計模擬此過程,輸入m、n, 輸出最後那個大王的編號。

    function king($n, $m){
        //建立1到n陣列
        $monkeys = range(1, $n);
        $i=0;
        //迴圈條件為猴子數量大於1
        while (count($monkeys)>1) {
            //$i為陣列下標;$i+1為猴子標號
            if(($i+1)%$m==0) {
                //餘數等於0表示正好第m個,刪除,用unset刪除保持下標關係
                unset($monkeys[$i]);
            } else {
                //如果餘數不等於0,則把陣列下標為$i的放最後,形成一個圓形結構
                array_push($monkeys,$monkeys[$i]);

                unset($monkeys[$i]);
            }
            //$i 迴圈+1,不斷把猴子刪除,或 push到陣列
            $i++;
        }
        //猴子數量等於1時輸出猴子標號,得出猴王
        return current($monkeys);
    }
    echo king(6,3);
  • range(m,n) 建立一個包含從 "m" 到 "n" 之間的元素範圍的陣列
    range(1, 5);
    // [0=>1, 1=>2, 2=>3, 3=>4, 4=>5];
  • unset(...$str) 銷燬給定的變數
    $array=[1,2,3,4,5];
    unset($array[2]);
    // [0=>1, 1=>2, 3=>4, 4=>5];
  • array_push($array, ...$str) 向陣列尾部插入變數
    $array=[1, 2];
    array_push($array, 3, 4);
    // [1, 2, 3, 4 ];
  • current() 輸出陣列中的當前元素的值
    end() - 將內部指標指向陣列中的最後一個元素,並輸出
    next() - 將內部指標指向陣列中的下一個元素,並輸出
    prev() - 將內部指標指向陣列中的上一個元素,並輸出
    reset() - 將內部指標指向陣列中的第一個元素,並輸出
    each() - 返回當前元素的鍵名和鍵值,並將內部指標向前移動
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章