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出现Cannot modify header information问题的解决方法大全
Apr 09 PHP
小文件php+SQLite存储方案
Sep 04 PHP
防止用户利用PHP代码DOS造成用光网络带宽
Mar 01 PHP
php URL跳转代码 减少外链
Jun 25 PHP
通达OA公共代码 php常用检测函数
Dec 14 PHP
php连接mssql数据库的几种方法
Feb 21 PHP
php文件服务实现虚拟挂载其他目录示例
Apr 17 PHP
php获取本周开始日期和结束日期的方法
Mar 09 PHP
Linux系统下php获得系统分区信息的方法
Mar 30 PHP
PHP中的Session对象如何使用
Sep 25 PHP
php数组函数array_key_exists()小结
Dec 10 PHP
imagettftext() 失效,不起作用
Mar 09 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 获取完整url地址
2008/12/20 PHP
php如何解决无法上传大于8M的文件问题
2014/03/10 PHP
全面解读PHP的人气开发框架Laravel
2015/10/15 PHP
Joomla使用Apache重写模式的方法
2016/05/04 PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
2021/03/09 PHP
jQuery中需要注意的细节问题小结
2011/12/06 Javascript
JavaScript 函数replace深入了解
2013/03/14 Javascript
JQuery实现用户名无刷新验证的小例子
2013/03/22 Javascript
js和jquery设置disabled属性为true使按钮失效
2014/08/07 Javascript
Jquery中offset()和position()的区别分析
2015/02/05 Javascript
使用npm发布Node.JS程序包教程
2015/03/02 Javascript
浅谈javascript的call()、apply()、bind()的用法
2016/02/21 Javascript
初识简单却不失优雅的Vue.js
2016/09/12 Javascript
网站发布后Bootstrap框架引用woff字体无法正常显示的解决方法
2016/11/24 Javascript
JS实现PC手机端和嵌入式滑动拼图验证码三种效果
2017/02/15 Javascript
shiro授权的实现原理
2017/09/21 Javascript
详解基于Vue+Koa的pm2配置
2017/10/24 Javascript
浅谈React组件之性能优化
2018/03/02 Javascript
Angular ng-animate和ng-cookies用法详解
2018/04/18 Javascript
在vue中使用防抖函数组件操作
2020/07/26 Javascript
[07:08]2014DOTA2西雅图国际邀请赛 小组赛7月11日TOPPLAY
2014/07/11 DOTA
python中dir函数用法分析
2015/04/17 Python
使用python3+xlrd解析Excel的实例
2018/05/04 Python
pytorch permute维度转换方法
2018/12/14 Python
用Python读取几十万行文本数据
2018/12/24 Python
Python 实现使用空值进行赋值 None
2020/03/12 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
2020/11/27 Python
个人简历中自我评价
2014/02/11 职场文书
读群众路线心得体会
2014/03/07 职场文书
《少年王勃》教学反思
2014/04/27 职场文书
大学生社会实践方案
2014/05/11 职场文书
客户经理竞聘演讲稿
2014/05/15 职场文书
我的梦想演讲稿1000字
2014/08/21 职场文书
保研推荐信格式
2015/03/25 职场文书
2016年学校党支部公开承诺书
2016/03/25 职场文书
2019如何书写演讲稿?
2019/07/01 职场文书