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

96
余_人
2017.12.04 11:56 字数 278

我们采用闭包自调用的方式,很轻松的解决了这个问题,无需循环,代码美观可读性强

1.我在桌面创建了一个php文件,实现过程如下:

function monkey(int $m,int $n){

        $arr = range(1,$n);

        $fn = function ($m,&$arr) use(&$fn){

                if( count($arr) === 1 ) { return true;  } //选出猴子大王,结束执行

                if( count($arr) >= $m ){ //判断s剩余猴子数量是否大于指定数

                        $key = array_keys($arr)[$m-1];  //第m只猴子的下标

                        unset($arr[$key]); //踢出第m只猴子

                        $arr = array_merge( array_splice($arr, $m-1),array_splice($arr,0,$m-1));

                }else{

                        $key =  array_keys($arr)[$m%count($arr)-1]; //第m只猴子的下标

                        unset($arr[$key]);

                };

                $fn($m,$arr); //自调用

};

$fn($m,$arr);  //执行

echo array_values($arr)[0]; 输出结果

}

monkey($argv[1],$argv[2]);  //调用

2. 运行过程如下:


3.命令行调用:


END 

我只是一个程序员,并不是专业写手,会不会更,在哪个博客更,都是由心情而定,如果喜欢我的可以粉我啊,说不定我就能更很多干货上来

程序人生
Web note ad 1