问题描述:n个人围成一圈,从编号为k的人开始报数,报到m的人出圈,剩下的人继续从1开始报数,报到m的人出圈;如此往复,求最后一个出圈的人
/*
* @param arr array 值为range(1,总人数)
* @param m int 报号到m的人出圈
* @param 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); //最后的一个人
标签:current,arr,出圈,int,param,约瑟夫,问题,算法,编号
From: https://blog.51cto.com/ding/8475660