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 相关文章推荐
一个多文件上传的例子(原创)
Oct 09 PHP
php下载远程文件类(支持断点续传)
Nov 14 PHP
php面向对象全攻略 (一) 面向对象基础知识
Sep 30 PHP
基于curl数据采集之正则处理函数get_matches的使用
Apr 28 PHP
php实现递归与无限分类的方法
Feb 16 PHP
php检索或者复制远程文件的方法
Mar 13 PHP
PHP判断是否为空的几个函数对比
Apr 21 PHP
CodeIgniter配置之routes.php用法实例分析
Jan 19 PHP
thinkphp项目如何自定义微信分享描述内容
Feb 20 PHP
PHP进阶学习之命名空间基本用法分析
Jun 18 PHP
laravel框架使用FormRequest进行表单验证,验证异常返回JSON操作示例
Feb 18 PHP
PHP Web表单生成器案例分析
Jun 02 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中usort在值相同时改变原始位置问题的解决方法
2011/11/27 PHP
PHP中4个加速、缓存扩展的区别和选用建议
2014/03/12 PHP
php设计模式之简单工厂模式详解
2014/09/04 PHP
php中Snoopy类用法实例
2015/06/19 PHP
php写入、删除与复制文件的方法
2015/06/20 PHP
PHP中快速生成随机密码的几种方式
2017/04/17 PHP
PHP操作Redis常用命令的实例详解
2020/12/23 PHP
分享27款非常棒的jQuery 表单插件
2011/03/28 Javascript
nodejs教程 安装express及配置app.js文件的详细步骤
2013/05/11 NodeJs
Jquery实现显示和隐藏的4种简单方式
2013/08/28 Javascript
node.js中的fs.readdirSync方法使用说明
2014/12/17 Javascript
js实现Select下拉框具有输入功能的方法
2015/02/06 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)
2016/05/27 Javascript
深入浅析JavaScript中的scrollTop
2016/07/11 Javascript
NODE.JS跨域问题的完美解决方案
2016/10/20 Javascript
jQuery实现圣诞节礼物动画案例解析
2016/12/25 Javascript
jQuery实现CheckBox全选、全不选功能
2017/01/11 Javascript
jQuery滑动到底部加载下一页数据的实例代码
2017/05/22 jQuery
使用prop解决一个checkbox选中后再次选中失效的问题
2017/07/05 Javascript
React + webpack 环境配置的方法步骤
2017/09/07 Javascript
javascript中的隐式调用
2018/02/10 Javascript
Nuxt页面级缓存的实现
2020/03/09 Javascript
Vue 组件注册全解析
2020/12/17 Vue.js
Python压缩解压缩zip文件及破解zip文件密码的方法
2015/11/04 Python
CentOS 7下Python 2.7升级至Python3.6.1的实战教程
2017/07/06 Python
python将txt文件读入为np.array的方法
2018/10/30 Python
python 读取二进制 显示图片案例
2020/04/24 Python
sklearn中的交叉验证的实现(Cross-Validation)
2021/02/22 Python
澳大利亚最受欢迎的超级商场每日优惠:Catch
2020/11/17 全球购物
大学毕业感言50字
2014/02/07 职场文书
城管综合整治方案
2014/05/01 职场文书
水利水电专业自荐信
2014/07/08 职场文书
个人四风问题整改措施
2014/10/24 职场文书
小学学习委员竞选稿
2015/11/20 职场文书