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 12 PHP
PHP 强制下载文件代码
Oct 24 PHP
php中的三元运算符使用说明
Jul 03 PHP
php删除文件夹及其文件夹下所有文件的函数代码
Jan 23 PHP
解析在apache里面给php写虚拟目录的详细方法
Jun 24 PHP
学习php过程中的一些注意点的总结
Oct 25 PHP
四种php中webservice实现的简单架构方法及实例
Feb 03 PHP
php计算整个目录大小的方法
Jun 19 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
Jun 09 PHP
PHP简单实现欧拉函数Euler功能示例
Nov 06 PHP
PHP基于DateTime类解决Unix时间戳与日期互转问题【针对1970年前及2038年后时间戳】
Jun 13 PHP
php设计模式之备忘模式分析【星际争霸游戏案例】
Mar 24 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
一个用于MySQL的PHP XML类
2006/10/09 PHP
PHP中如何调用webservice的实例参考
2013/04/25 PHP
深入php define()函数以及defined()函数的用法详解
2013/06/05 PHP
PHP实现二维数组(或多维数组)转换成一维数组的常见方法总结
2019/12/04 PHP
ImageFlow可鼠标控制图片滚动
2008/01/30 Javascript
JS实现浏览器状态栏文字闪烁效果的方法
2015/10/27 Javascript
JSP基于Bootstrap分页显示实例解析
2016/06/12 Javascript
你不需要jQuery(三) 新AJAX方法fetch()
2016/06/14 Javascript
JS判断来路是否是百度等搜索索引进行弹窗或自动跳转的实现代码
2016/10/09 Javascript
值得学习的bootstrap fileinput文件上传工具
2016/11/08 Javascript
React如何将组件渲染到指定DOM节点详解
2017/09/08 Javascript
动态Axios的配置步骤详解
2018/01/12 Javascript
js中的reduce()函数讲解
2019/01/18 Javascript
javascript原型链学习记录之继承实现方式分析
2019/05/01 Javascript
Vue data的数据响应式到底是如何实现的
2020/02/11 Javascript
vue 实现click同时传入事件对象和自定义参数
2021/01/29 Vue.js
50行代码实现贪吃蛇(具体思路及代码)
2013/04/27 Python
python基础教程之常用运算符
2014/08/29 Python
解决python读取几千万行的大表内存问题
2018/06/26 Python
PyQt5根据控件Id获取控件对象的方法
2019/06/25 Python
Python turtle绘画象棋棋盘
2019/08/21 Python
对python中各个response的使用说明
2020/03/28 Python
Python如何批量获取文件夹的大小并保存
2020/03/31 Python
BeautifulSoup获取指定class样式的div的实现
2020/12/07 Python
python 实现有道翻译功能
2021/02/26 Python
GUESS西班牙官方网上商城:美国服饰品牌
2017/03/15 全球购物
伦敦哈德森鞋:Hudson Shoes
2018/02/06 全球购物
JACK & JONES荷兰官网:男士服装和鞋子
2021/03/07 全球购物
高中毕业自我评价
2014/02/08 职场文书
2014年党员个人剖析材料
2014/10/08 职场文书
2015年社区创卫工作总结
2015/04/21 职场文书
投诉书范文
2015/07/02 职场文书
筑梦中国心得体会
2016/01/18 职场文书
2017新年晚会开幕词
2016/03/03 职场文书
《中国古代诗歌散文欣赏》高中语文教材
2019/08/20 职场文书
python正则表达式re.search()的基本使用教程
2021/05/21 Python