无意间看到了这个丢手帕问题,于是乎自己动手写了写这个的解决方法。
$array = array(1,2,3,4,5,6,7,8,9,10);
$flag = 0;
while (count($array)>1){
if(($flag+1)%3 == 0)
{
echo PHP_EOL.$array[$flag]."<br>";
unset($array[$flag]);
}
else
{
array_push($array, $array[$flag]);
unset($array[$flag]);
}
$flag ++;
}
其实挺简单的一个问题,主要需要注意一些细节
下面是利用递归去处理的方法
function doJosephus($arr, $k, $m) {
//静态变量(存在数据不能计时清除的危险)
static $storage = array();
$temp = array();
$cnt = count($arr);
//判断数组是否有元素,否则退出执行
if ($cnt) {
$k_mod = ($cnt - $k + 1) % $m - $m; //为下一次调用时设置的开始位置
static $start = 1; //初始化开始位置为1
for ($i = 0; $i < $cnt; $i++) {
if ($i >= $k - 1) {//从大于等于$k位置(计为1),开始处理
if (!($start % $m)) {
//等于$m长度则入库
$storage[] = array_shift($arr);
} else {
//不属于$m长度的则计入下一个处理的数组
$temp[] = array_shift($arr);
}
//指针在一个环内不断的往前走(加1)
$start++;
} else {
//在$k位置之前的元素全部进入下一次循环
$temp[] = array_shift($arr);
}
}
//递归调用开始(模拟链接环的作用)
doJosephus($temp, $k_mod, $m);
}
return $storage;
}
$array = array(1,2,3,4,5,6,7,8,9,10);
$r = doJosephus($array, 1, 3);