约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。
例如只有三个人,把他们叫做A、B、C,他们围成一圈,从A开始报数,假设报2的人被杀掉。
●首先A开始报数,他报1。侥幸逃过一劫。
●然后轮到B报数,他报2。非常惨,他被杀了
●C接着从1开始报数
●接着轮到A报数,他报2。也被杀死了。
●最终胜利者是C
function Joseph($start,$interval,$numbers) {
if ($start>$numbers) {
echo "参数错误";
}
$arr = range(1,$numbers);
//首先初始化排序
for ($j=0;$j<count($arr);$j++) {
$head = array_shift($arr);
if ($head!=$start) {
array_push($arr,$head);
} else {
array_unshift($arr,$head);
}
}
$j=0;
while(count($arr)>1) {
$j=$j+1;
$head = array_shift($arr);
if ($j%$interval!=0) {
array_push($arr,$head);
} else {
$j=0;
}
}
}
Joseph(4,3,5);