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 相关文章推荐
PHP中文汉字验证码
Apr 08 PHP
php上的memcache和memcached两个pecl库
Mar 29 PHP
php中获取关键词及所属来源搜索引擎名称的代码
Feb 15 PHP
PHP 魔术变量和魔术函数详解
Feb 25 PHP
php使用Session和文件统计在线人数
Jul 04 PHP
服务器迁移php版本不同可能诱发的问题
Dec 22 PHP
AJAX PHP无刷新form表单提交的简单实现(推荐)
Sep 09 PHP
php 使用redis锁限制并发访问类示例
Nov 02 PHP
php使用Jpgraph创建3D饼形图效果示例
Feb 15 PHP
PHP用PDO如何封装简单易用的DB类详解
Jul 30 PHP
Laravel框架使用Seeder实现自动填充数据功能
Jun 13 PHP
Cookie跨域问题解决方案代码示例
Nov 24 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
十天学会php之第三天
2006/10/09 PHP
PHP DB 数据库连接类定义与用法示例
2019/03/11 PHP
Smarty模板类内部原理实例分析
2019/07/03 PHP
解决laravel id非自增 模型取回为0 的问题
2019/10/11 PHP
PHP实现抽奖功能实例代码
2020/06/30 PHP
PHP7新特性
2021/03/09 PHP
下载站控制介绍字数显示的脚本 显示全部 隐藏介绍等功能
2009/09/19 Javascript
js中的屏蔽的使用示例
2013/07/30 Javascript
jquery 设置元素相对于另一个元素的top值(实例代码)
2013/11/06 Javascript
javascript获取URL参数与参数值的示例代码
2013/12/20 Javascript
Extjs的FileUploadField文件上传出现了两个上传按钮
2014/04/29 Javascript
jquery实现在页面加载的时自动为日期插件添加当前日期
2014/08/20 Javascript
jQuery事件用法实例汇总
2014/08/29 Javascript
Bootstrap每天必学之进度条
2015/11/30 Javascript
酷炫jQuery全屏3D焦点图动画效果
2016/03/22 Javascript
js添加千分位的实现代码(超简单)
2016/08/01 Javascript
ionic2打包android时gradle无法下载的解决方法
2017/04/05 Javascript
Vue.js基础指令实例讲解(各种数据绑定、表单渲染大总结)
2017/07/03 Javascript
vue组件name的作用小结
2018/05/23 Javascript
Python抓取淘宝下拉框关键词的方法
2015/07/08 Python
Python数据结构之栈、队列及二叉树定义与用法浅析
2018/12/27 Python
Python编程中flask的简介与简单使用
2018/12/28 Python
PyQt5 加载图片和文本文件的实例
2019/06/14 Python
pytorch 实现查看网络中的参数
2020/01/06 Python
使用 Python 处理3万多条数据只要几秒钟
2020/01/19 Python
Python换行与不换行的输出实例
2020/02/19 Python
python利用datetime模块计算程序运行时间问题
2020/02/20 Python
keras中epoch,batch,loss,val_loss用法说明
2020/07/02 Python
北京振戎融通Java面试题
2015/09/03 面试题
总裁岗位职责
2013/12/04 职场文书
我未来的职业规划范文
2014/01/11 职场文书
个人租房协议书样本
2014/10/01 职场文书
升学宴答谢词
2015/01/05 职场文书
先进工作者个人总结
2015/02/15 职场文书
红色电影观后感
2015/06/18 职场文书
汽车车尾标语大全
2015/08/11 职场文书