php解决约瑟夫环算法实例分析


Posted in PHP onSeptember 30, 2019

本文实例讲述了php解决约瑟夫环算法。分享给大家供大家参考,具体如下:

今天偶遇一道算法题

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

方法一:递归算法

function killMonkey($monkeys , $m , $current = 0){
  $number = count($monkeys);
  $num = 1;
  if(count($monkeys) == 1){
    echo $monkeys[0]."成为猴王了";
    return;
  }
  else{
    while($num++ < $m){
      $current++ ;
      $current = $current%$number;
    }
    echo $monkeys[$current]."的猴子被踢掉了<br/>";
    array_splice($monkeys , $current , 1);
    killMonkey($monkeys , $m , $current);
  }
}
$monkeys = array(1 , 2 , 3 , 4 , 5 , 6 , 7, 8 , 9 , 10); //monkeys的编号
$m = 3; //数到第几只猴子被踢出
killMonkey($monkeys , $m);

运行结果:

3的猴子被踢掉了
6的猴子被踢掉了
9的猴子被踢掉了
2的猴子被踢掉了
7的猴子被踢掉了
1的猴子被踢掉了
8的猴子被踢掉了
5的猴子被踢掉了
10的猴子被踢掉了
4成为猴王了

方法二:线性表应用

最后这个算法最牛,

哦,是这样的,每个猴子出列后,剩下的猴子又组成了另一个子问题。只是他们的编号变化了。第一个出列的猴子肯定是a[1]=m(mod)n(m/n的余数),他除去后剩下的猴子是a[1]+1,a[1]+2,…,n,1,2,…a[1]-2,a[1]-1,对应的新编号是1,2,3…n-1。设此时某个猴子的新编号是i,他原来的编号就是(i+a[1])%n。于是,这便形成了一个递归问题。假如知道了这个子问题(n-1个猴子)的解是x,那么原问题(n个猴子)的解便是:(x+m%n)%n=(x+m)%n。问题的起始条件:如果n=1,那么结果就是1。

function yuesefu($n,$m) {
  $r=0;
  for($i=2; $i<=$n; $i++) {
    $r=($r+$m)%$i;
  }
  return $r+1;
}
echo yuesefu(10,3)."是猴王";

运行结果:

4是猴王

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
Apache设置虚拟WEB
Oct 09 PHP
php mysql数据库操作类
Jun 04 PHP
使用PHP实现二分查找算法代码分享
Jun 24 PHP
Laravel 5框架学习之Blade 简介
Apr 08 PHP
php中使用in_array() foreach array_search() 查找数组是否包含时的性能对比
Apr 14 PHP
PHP中的事务使用实例
May 26 PHP
THINKPHP在添加数据的时候获取主键id的值方法
Apr 03 PHP
PHP常见数组排序方法小结
Aug 20 PHP
网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)
Oct 23 PHP
PHP中的self关键字详解
Jun 23 PHP
Laravel 实现关系模型取出需要的字段
Oct 10 PHP
PHP 计算至少是其他数字两倍的最大数的实现代码
May 26 PHP
php使用curl伪造浏览器访问操作示例
Sep 30 #PHP
laravel-admin 在列表页添加自定义按钮的例子
Sep 30 #PHP
Laravel框架控制器的request与response用法示例
Sep 30 #PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
Sep 30 #PHP
Laravel框架控制器的middleware中间件用法分析
Sep 30 #PHP
Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
Sep 30 #PHP
laravel实现登录时监听事件,添加登录用户的记录方法
Sep 30 #PHP
You might like
自己前几天写的无限分类类
2007/02/14 PHP
PHP在线生成二维码(google api)的实现代码详解
2013/06/04 PHP
浅析PHP的ASCII码转换类
2013/07/05 PHP
php输入流php://input使用示例(php发送图片流到服务器)
2013/12/25 PHP
php的SimpleXML方法读写XML接口文件实例解析
2014/06/16 PHP
PHP curl实现抓取302跳转后页面的示例
2014/07/04 PHP
PHP冒泡算法详解(递归实现)
2014/11/10 PHP
跨浏览器PHP下载文件名中的中文乱码问题解决方法
2015/03/05 PHP
PHP简单实现生成txt文件到指定目录的方法
2016/04/25 PHP
数据结构之利用PHP实现二分搜索树
2020/10/25 PHP
AngularJS入门教程之控制器详解
2016/07/27 Javascript
一个非常好用的文字滚动的案例,鼠标悬浮可暂停[两种方案任选]
2016/12/01 Javascript
使用Node.js实现简易MVC框架的方法
2017/08/07 Javascript
Angular刷新当前页面的实现方法
2018/11/21 Javascript
vue实现图片上传预览功能
2019/12/23 Javascript
vue 子组件watch监听不到prop的解决
2020/08/09 Javascript
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
2015/04/05 Python
Python中的urllib模块使用详解
2015/07/07 Python
Python批量提取PDF文件中文本的脚本
2018/03/14 Python
详解pandas库pd.read_excel操作读取excel文件参数整理与实例
2019/02/17 Python
Python 获取 datax 执行结果保存到数据库的方法
2019/07/11 Python
pygame实现俄罗斯方块游戏(基础篇1)
2019/10/29 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
2020/06/24 Python
python开发一款翻译工具
2020/10/10 Python
使用Django的JsonResponse返回数据的实现
2021/01/15 Python
HTML5边玩边学(3)像素和颜色
2010/09/21 HTML / CSS
YesBabyOnline美国:全球性的在线婚纱礼服工厂
2018/05/05 全球购物
戴森台湾线上商城:Dyson Taiwan
2018/05/21 全球购物
优秀员工年终发言演讲稿
2014/01/01 职场文书
学生打架检讨书1000字
2014/01/16 职场文书
对标管理实施方案
2014/03/12 职场文书
地理教师岗位职责
2014/03/16 职场文书
英文邀请函
2015/02/02 职场文书
关于调整工作时间的通知
2015/04/24 职场文书
2015年超市员工工作总结
2015/05/04 职场文书
2016年综治宣传月活动宣传标语口号
2016/03/16 职场文书