约瑟夫环问题:
一群猴子排成一圈,按1,2,3,4,...,n依次编号,然后从第一只,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,再把它踢出去,... ,如此不停地进行下去,直到最后剩下一只猴子为止,那只猴子就叫大王,,要求编程模拟过程,输入n,m,输出最后那个大王的编号
具体代码实现如下:
/**
* [猴子选大王]
* @param [type] $n [猴子数]
* @param [type] $m [出局次数]
* @return [type] [description]
*/
// 约瑟夫环问题
function getKing($n,$m) {
// 初始化一个数组
$arr = range(1,$n);
// 初始化一个变量
$i = 0;
// 因为要确定最后一个结果,所以只要数组的长度大于1,就继续数
while(count($arr)>1) {
if(($i+1)%$m == 0) { //判断是否是$m的倍数,如果是,则去掉
unset($arr[$i]);
} else { // 如果不是,则把该单元追加到数组的尾部,同时把该单元删掉,避免重复
array_push($arr,$arr[$i]);
unset($arr[$i]);
}
$i++;
}
return $arr[$i];
}
function last($n,$m) {
$arr = range(1,$n);
$i=0;
while(count($arr)>1) {
$i += 1;
//一个个出列最前面的猴子
$head = array_shift($arr);
if($i%$m != 0) {
// 如果不是m的倍数,则把猴子返回尾部,否则就抛掉,也就是出列
array_push($arr,$head);
}
}
return $arr[0];
}
echo last(10,7);