问题描述:n个人围成一圈,从编号为k的人开始报数,报到m的人出圈,剩下的人继续从1开始报数,报到m的人出圈;如此往复,求最后一个出圈的人
/*
* arr array 值为range(1,总人数)
* m int 报号到m的人出圈
* current int 从第current+1 个人开始喊1;值为k-1
* return 返回最后一个人的编号
* */
//所有人从1到n编号,放到一个数组中
function JosephusProblem($arr,$m,$current=0){
$len = count($arr);
if($len==1){
return $arr[0]; //只剩一个人时候跳出递归
}else{
$i=1;
while($i<$m){
$i++;
$current++;
$current = $current%$len; //比如,最后剩3人,但m为5;5%3=2
}
//从数组中移除元素,并用新元素取代它:array_splice(array,start,length,array)
//echo $arr[$current],' '; //打印每一次报到m号的人
array_splice($arr,$current,1);
return JosephusProblem($arr,$m,$current); //开始下一次1到m的报数
}
}
//所有人从1到n编号,放到一个数组中
$arr = range(1,41);
echo JosephusProblem($arr,3,0); //最后的一个人