猴子当大王的算法解析

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

function yuesefu($n,$m) 
{ 
    $r=0; 
    for($i=2; $i<=$n; $i++) 
    { 
        $r=($r+$m)%$i; 
    } 
    return $r+1; 
} 
echo(yuesefu(5,3));

?>

想问下为什么可以使用这个方式进行求出最后的胜利者?看到很多比较复杂递归的算法都没有这个简单,所以想找人分析下,谢谢了。

阅读 3.1k
1 个回答

根据约瑟夫环的推导公式f(n) = x = (f(n-1) + 3) % n直接套用的,这是个经典问题,百科解释已经很全面了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题