php解決約瑟夫問題

2021-09-23 19:27:40 字數 1651 閱讀 3329

「約瑟夫環」是乙個數學的應用問題:一群猴子排成一圈,按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人該人就必須自殺,然後再由下乙個重新報數,直到所...