递归解决约瑟夫问题

一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。

function digui($monkeys,$m)

{

$count= count($monkeys);//获取数组长度

//判断数组长度是否小于$m,小于则结束递归,返回猴王

if ($count<$m){

return $monkeys[$count-1];

}else {

unset($monkeys[$m - 1]);//淘汰$m位

for ($i=0;$i<$m-1;$i++){

$monkeys[$count+$i]= $monkeys[$i];//把数过的人放到最后

unset($monkeys[$i]);

}

$monkeys = array_values($monkeys);//重置索引

digui($monkeys,$m);

}

}

//$n数组长度,淘汰第$m位

function king($n = 6,$m = 3)

{

$monkeys= range(1,$n);//创建1到n数组

    $a= digui($monkeys,$m);

echo $a;//猴子数量等于1时输出猴子标号,得出猴王

}

king(6,3);

你可能感兴趣的:(递归解决约瑟夫问题)