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 25 PHP
PHP+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)
Dec 28 PHP
PHP imagegrabscreen和imagegrabwindow(截取网站缩略图)的实例代码
Nov 07 PHP
PHP判断IP并转跳到相应城市分站的方法
Mar 25 PHP
phpMyAdmin安装并配置允许空密码登录
Jul 04 PHP
WordPress迁移时一些常见问题的解决方法整理
Nov 24 PHP
WordPress中获取所使用的模板的页面ID的简单方法
Dec 31 PHP
Symfony2框架学习笔记之表单用法详解
Mar 18 PHP
php原生导出excel文件的两种方法(推荐)
Nov 19 PHP
Laravel5.5以下版本中如何自定义日志行为详解
Aug 01 PHP
php curl操作API接口类完整示例
May 21 PHP
Laravel等框架模型关联的可用性浅析
Dec 15 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入门学习知识点一 PHP与MYSql连接与查询
2011/07/14 PHP
深入分析php之面向对象
2013/05/15 PHP
解析wamp5下虚拟机配置文档
2013/06/27 PHP
php简单实现发送带附件的邮件
2015/06/10 PHP
PHP连接MySQL数据库并以json格式输出
2018/05/21 PHP
jquerymobile checkbox及时刷新才能获取其准确值
2012/04/14 Javascript
JQuery 图片的展开和伸缩实例讲解
2013/04/18 Javascript
封装了一个支持匿名函数的Javascript事件监听器
2014/06/05 Javascript
Jquery中offset()和position()的区别分析
2015/02/05 Javascript
Nodejs全局安装和本地安装的不同之处
2016/07/04 NodeJs
js获取html的span标签的值方法(超简单)
2016/07/26 Javascript
JavaScript如何实现跨域请求
2016/08/05 Javascript
jQuery实现6位数字密码输入框
2016/12/29 Javascript
通过源码分析Vue的双向数据绑定详解
2017/09/24 Javascript
webpack4 css打包压缩问题的解决
2018/05/18 Javascript
详解vue移动端项目代码拆分记录
2019/03/15 Javascript
TypeScript中使用getElementXXX()的示例代码
2019/09/12 Javascript
js实现可爱的气泡特效
2020/09/05 Javascript
[02:27]2014DOTA2国际邀请赛 VG赛后采访:更大的挑战在等着我们
2014/07/13 DOTA
[01:04:39]OG vs Mineski 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
Python 不同对象比较大小示例探讨
2014/08/21 Python
Python cookbook(数据结构与算法)将多个映射合并为单个映射的方法
2018/04/19 Python
python自动化之Ansible的安装教程
2019/06/13 Python
Python命名空间namespace及作用域原理解析
2020/06/05 Python
使用keras实现孪生网络中的权值共享教程
2020/06/11 Python
Origins加拿大官网:雅诗兰黛集团高端植物护肤品牌
2017/11/19 全球购物
优衣库美国官网:UNIQLO美国
2018/04/14 全球购物
请编程遍历页面上所有 TextBox 控件并给它赋值为 string.Empty
2015/12/03 面试题
MYSQL相比于其他数据库有哪些特点
2013/07/19 面试题
Java程序员常见面试题
2015/07/16 面试题
八一建军节活动方案
2014/02/10 职场文书
大学生工作自荐书
2014/06/16 职场文书
信用卡收入证明范本
2015/06/12 职场文书
大学生如何逃脱“毕业季创业队即散伙”魔咒?
2019/08/19 职场文书
原生Js 实现的简单无缝滚动轮播图的示例代码
2021/05/10 Javascript
苹果的回收机器人可以通过拆解iPhone获取大量的金和铜并外公布了环境保护最新进展
2022/04/21 数码科技