「約瑟夫環」是乙個數學的應用問題:一群猴子排成一圈,按1,2,…,n依次編號。然後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數, 再數到第m只,在把它踢出去…,如此不停的進行下去, 直到最後只剩下乙隻猴子為止,那只猴子就叫做大王。要求程式設計模擬此過程,輸入m、n, 輸出最後那個大王的編號。
下面列出了三種用php來解決此問題的方法:
按邏輯依次去除
遞迴演算法
線性表應用
方法一,按照邏輯依次去除
function getkingmokey($n, $m)
$len = count($monkey);
//迴圈遍歷陣列元素(猴子編號)
for($i= 0; $i< $len; $i= $i)
//若只剩乙隻猴子 則輸出該猴子編號(陣列元素值) 並退出迴圈
if($num == 1)
/* * 若剩餘猴子數大於1($num > 1)
* 繼續程式
*///將第$i只猴子踢出隊伍(相應陣列位置元素值設為0)
$monkey[$i] = 0;
/** 獲取下乙隻需要踢出隊伍的猴子編號
* 在$m值範圍內遍歷猴子 並設定$m的計數器
* 依次取下一猴子編號
* 若元素值為0,則該位置的猴子已被踢出隊伍
* 若不為0,繼續獲取下一猴子編號,且計數器加1
* 若取得的猴子編號大於陣列個數
* 則從第0只猴子開始遍歷(陣列指標歸零) 步驟同上
* 直到計數器到達$m值 * 最後獲取的$i值即為下乙隻需要踢出隊伍的猴子編號
*///設定計數器
for($j= 1; $j<= $m; $j++)
}//若編號大於猴子個數,則從第0只猴子開始遍歷(陣列指標歸零) 步驟同上
if($i == $len) $i = 0;
//同上步驟,獲取下乙隻猴子編號
if($monkey[$i] == 0) } }
}}//猴子個數
$n = 10;
//踢出隊伍的編號間隔值
$m = 3;
//呼叫猴王獲取函式
echo getkingmokey($n, $m)."是猴王";
方法二,遞迴演算法
function killmonkey($monkeys , $m , $current = 0)
else
echo $monkeys[$current]."的猴子被踢掉了
"; 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);
方法三,線性表應用
function yuesefu($n,$m)
return $r+1;
} echo yuesefu(10,3)."是猴王";
使用php解決約瑟夫問題
約瑟夫問題是個有名的問題 n個人圍成一圈,從第乙個開始報數,報道第m個時序號為m的人出列,然後序號為m 1的人開始從頭報數依此類推 報到m的人出列,問最後剩下的那個人的序號是幾 利用環形鍊錶來解決這個問題,下面是php實現的例項 利用環形鍊錶解決約瑟夫問題 一群孩子圍成一圈 小孩數量為n 開始數數 ...
php解決約瑟夫環
今天偶遇一道演算法題 約瑟夫環 是乙個數學的應用問題 一群猴子排成一圈,按1,2,n依次編號。然後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數,再數到第m只,在把它踢出去 如此不停的進行下去,直到最後只剩下乙隻猴子為止,那只猴子就叫做大王。要求程式設計模擬此過程,輸入m n,輸出最後那個...
python解決約瑟夫問題
據說著名猶太歷史學家 josephus有過以下的故事 在羅馬人占領喬塔帕特後,39 個猶太人與josephus及他的朋友躲到乙個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了乙個自殺方式,41個人排成乙個圓圈,由第1個人開始報數,每報數到第3人該人就必須自殺,然後再由下乙個重新報數,直到所...