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 开源框架22个简单简介
Aug 24 PHP
php session和cookie使用说明
Apr 07 PHP
用PHP实现的四则运算表达式计算实现代码
Aug 02 PHP
在windows服务器开启php的gd库phpinfo中未发现
Jan 13 PHP
PHP中CURL方法curl_setopt()函数的参数分享
Jan 19 PHP
常用的php图片处理类(水印、等比缩放、固定高宽)分享
Jun 19 PHP
php实现编辑和保存文件的方法
Jul 20 PHP
php版微信自动登录并获取昵称的方法
Sep 23 PHP
分享PHP-pcntl 实现多进程代码
Sep 30 PHP
PHP版微信小店接口开发实例
Nov 12 PHP
php使用环形链表解决约瑟夫问题完整示例
Aug 07 PHP
php链式操作的实现方式分析
Aug 12 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
phpmyadmin中禁止外网使用的方法
2014/11/04 PHP
ThinkPHP实现递归无级分类――代码少
2015/07/29 PHP
PHP定时执行任务实现方法详解(Timer)
2015/07/30 PHP
php常用字符函数实例小结
2016/12/29 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
PHP实现的字符串匹配算法示例【sunday算法】
2017/12/19 PHP
基于jquery的让textarea自适应高度的插件
2010/08/03 Javascript
jQuery学习基础知识小结
2010/11/25 Javascript
JavaScript 放大镜 放大倍率和视窗尺寸
2011/05/09 Javascript
jQuery模拟黑客帝国矩阵效果实例
2015/06/28 Javascript
jquery实现简单的banner轮播效果【实例】
2016/03/30 Javascript
JS控制文本域只读或可写属性的方法
2016/06/24 Javascript
JavaScript日期选择功能示例
2017/01/16 Javascript
详解vue-cli项目中的proxyTable跨域问题小结
2018/02/09 Javascript
Vue组件基础用法详解
2020/02/05 Javascript
[34:10]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
python下如何查询CS反恐精英的服务器信息
2017/01/17 Python
python实现微信接口(itchat)详细介绍
2017/10/23 Python
Python使用matplotlib简单绘图示例
2018/02/01 Python
Python通过属性手段实现只允许调用一次的示例讲解
2018/04/21 Python
python的xpath获取div标签内html内容,实现innerhtml功能的方法
2019/01/02 Python
详解Django项目中模板标签及模板的继承与引用(网站中快速布置广告)
2019/03/27 Python
Python/Django后端使用PIL Image生成头像缩略图
2019/04/30 Python
Python实现二叉树的最小深度的两种方法
2019/09/30 Python
python实现飞机大战项目
2020/03/11 Python
python 实现ping测试延迟的两种方法
2020/12/10 Python
在Pycharm中安装Pandas库方法(简单易懂)
2021/02/20 Python
HTML5 语音搜索(淘宝店语音搜素)
2013/01/03 HTML / CSS
Parfumdreams芬兰:购买香水和化妆品
2021/02/13 全球购物
草莓网中国:StrawberryNet中国
2020/08/17 全球购物
本科毕业生求职自荐信
2014/04/09 职场文书
爱国演讲稿400字
2014/05/07 职场文书
物业消防安全责任书
2014/07/23 职场文书
作弊检讨书范文
2015/05/06 职场文书
小学运动会通讯稿
2015/07/18 职场文书
apache ftpserver搭建ftp服务器
2022/05/20 Servers