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 相关文章推荐
漂亮但不安全的CTB
Oct 09 PHP
关于Intype一些小问题的解决办法
Mar 28 PHP
PHP 木马攻击防御技巧
Jun 13 PHP
在Windows下编译适用于PHP 5.2.12及5.2.13的eAccelerator.dll(附下载)
May 04 PHP
解析crontab php自动运行的方法
Jun 24 PHP
php中字符查找函数strpos、strrchr与strpbrk用法
Nov 18 PHP
PHP实现PDO的mysql数据库操作类
Dec 12 PHP
php实现redis数据库指定库号迁移的方法
Jan 14 PHP
CodeIgniter针对lighttpd服务器URL重写的方法
Jun 10 PHP
PHP list() 将数组中的值赋给变量的简单实例
Jun 13 PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
Dec 14 PHP
ThinkPHP中Widget扩展的两种写法及调用方法详解
May 04 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
天津市收音机工业发展史
2021/03/04 无线电
THINKPHP2.0到3.0有哪些改进之处
2015/01/04 PHP
PHP实现的构造sql语句类实例
2016/02/03 PHP
JQuery之拖拽插件实现代码
2011/04/14 Javascript
常见表单重复提交问题整理及解决方法
2013/11/13 Javascript
JavaScript中双叹号(!!)作用示例介绍
2014/04/10 Javascript
基于jquery实现表格内容筛选功能实例解析
2016/05/09 Javascript
JS复制对应id的内容到粘贴板(Ctrl+C效果)
2017/01/23 Javascript
jquery实现超简单的瀑布流布局【推荐】
2017/03/08 Javascript
移动前端图片压缩上传的实例
2017/12/06 Javascript
node内置调试方法总结
2018/02/22 Javascript
angular实现页面打印局部功能的思考与方法
2018/04/13 Javascript
vue树形结构获取键值的方法示例
2018/06/21 Javascript
Angular5.0 子组件通过service传递值给父组件的方法
2018/07/13 Javascript
Vue 中axios配置实例详解
2018/07/27 Javascript
JQuery搜索框自动补全(模糊匹配)功能实现示例
2019/01/08 jQuery
vue使用el-upload上传文件及Feign服务间传递文件的方法
2019/03/15 Javascript
详解可以用在VS Code中的正则表达式小技巧
2019/05/14 Javascript
vue elementUI 表单校验的实现代码(多层嵌套)
2019/11/06 Javascript
jquery实现烟花效果(面向对象)
2020/03/10 jQuery
vue+element_ui上传文件,并传递额外参数操作
2020/12/05 Vue.js
Python3操作MongoDB增册改查等方法详解
2020/02/10 Python
Python如何避免文件同名产生覆盖
2020/06/09 Python
中国京东和泰国中央集团合资的网站:JD CENTRAL
2020/08/22 全球购物
法国包包和行李箱销售网站:Bagage24.fr
2020/03/24 全球购物
PHP如何自定义函数
2016/09/16 面试题
八年级数学教学反思
2014/01/31 职场文书
社区健康教育实施方案
2014/03/18 职场文书
2014市国税局对照检查材料思想汇报
2014/09/23 职场文书
学生不讲诚信检讨书
2014/09/29 职场文书
以权谋私检举信范文
2015/03/02 职场文书
2015年药品销售工作总结范文
2015/05/25 职场文书
法律服务所工作总结
2015/08/10 职场文书
小学作文指导之如何写人?
2019/07/08 职场文书
Python+Matplotlib图像上指定坐标的位置添加文本标签与注释
2022/04/11 Python
pytorch实现加载保存查看checkpoint文件
2022/07/15 Python