热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PHP有趣的经典算法

许多人在学习C语言的时候都写过一些有趣的算法,其实这些算法在PHP中也同样可以实现,甚至有些算法的代码比C语言中还要简洁。

许多人在学习C语言的时候都写过一些有趣的算法,其实这些算法在PHP中也同样可以实现,甚至有些算法的代码比C语言中还要简洁。

1、一群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n, 输出最后那个大王的编号。

function king($n, $m){
    $mOnkeys= range(1, $n);         //创建1到n数组
    $i=0;
    while (count($monkeys)>1) {   //循环条件为猴子数量大于1
        if(($i+1)%$m==0) {   //$i为数组下标;$i+1为猴子标号
            unset($monkeys[$i]);    //余数等于0表示正好第m个,删除,用unset删除保持下标关系
        } else {
            array_push($monkeys,$monkeys[$i]);     //如果余数不等于0,则把数组下标为$i的放最后,形成一个圆形结构
            unset($monkeys[$i]);
        }
            $i++;//$i 循环+1,不断把猴子删除,或 push到数组 
    }
    return current($monkeys);   //猴子数量等于1时输出猴子标号,得出猴王
}
echo king(6,3);

2、有一母牛,到4岁可生育,每年一头,所生均是一样的母牛,到15岁绝育,不再能生,20岁死亡,问n年后有多少头牛。

function niu($y){
    static $num= 1;                 //定义静态变量;初始化牛的数量为1
    for ($i=1; $i <=$y ; $i++) {     
        if($i>=4 && $i<15){         //每年递增来算,4岁开始+1,15岁不能生育
        $num++;
            niu($y-$i);             //递归方法计算小牛$num,小牛生长年数为$y-$i
        }else if($i==20){           
        $num--;                          //20岁死亡减一
        }
    return $num;
}
}

3、杨辉三角

num=$var;
  }
  public function display(){
    $n=$this->num;
    $arr=array();
  //$arr=array_fill(0,$n+1,array_fill(0,$n+1,0));
    $arr[1]=array_fill(0,3,0);
    $arr[1][1]=1;
    echo str_pad(" ",$n*12," ");
    printf("%3d",$arr[1][1]);
    echo "
"; for($i=2;$i<=$n;$i++){ $arr[$i]=array_fill(0,($i+2),0); for($j=1;$j<=$i;$j++){ if($j==1) echo str_pad(" ",($n+1-$i)*12," "); printf("%3d",$arr[$i][$j]=$arr[$i-1][$j-1]+$arr[$i-1][$j]); echo " "; } echo"
"; } } } $yh=new T(&#39;3&#39;); //$yh=new T(数量); $yh->display(); ?>

4.冒泡排序

function maopao($arr){
    $len = count($arr); 
    for($k=0;$k<=$len;$k++)
    {
        for($j=$len-1;$j>$k;$j--){
          if($arr[$j]<$arr[$j-1]){
            $temp = $arr[$j];
            $arr[$j] = $arr[$j-1];
            $arr[$j-1] = $temp;
          }
        }
    }
    return $arr;
}

5.快速排序

function quickSort($arr) {
    //先判断是否需要继续进行
    $length = count($arr);
    if($length <= 1) {
        return $arr;
    }
    //选择第一个元素作为基准
    $base_num = $arr[0];
    //遍历除了标尺外的所有元素,按照大小关系放入两个数组内
    //初始化两个数组
    $left_array = array();  //小于基准的
    $right_array = array();  //大于基准的
    for($i=1; $i<$length; $i++) {
        if($base_num > $arr[$i]) {
            //放入左边数组
            $left_array[] = $arr[$i];
        } else {
            //放入右边
            $right_array[] = $arr[$i];
        }
    }
    //再分别对左边和右边的数组进行相同的排序处理方式递归调用这个函数
    $left_array = quickSort($left_array);
    $right_array = quickSort($right_array);
    //合并
  
    return array_merge($left_array, array($base_num), $right_array);
}

6.二分查找算法(折半查找算法)

function binsearch($x,$a){
    $c=count($a);
    $lower=0;
    $high=$c-1;
    while($lower<=$high){
        $middle=intval(($lower+$high)/2);
        if($a[$middle]>$x){
            $high=$middle-1;
        } elseif($a[$middle]<$x){
            $lower=$middle+1;
        } else{
            return $middle;
        }
    }
    return false;
}

7.PHP奇异算法

PHP7以下的版本返回的是 6,PHP7版本返回5 ,还真的算奇异,个人底层算法差,认为是PHP7以下版本的BUG8.字符集合:输入一个字符串,求出该字符串包含的字符集合,并按顺序排序(英文)

function set($str){
    //转化为数组
    $arr = str_split($str);
    //去除重复
    $arr = array_flip(array_flip($arr));
    //排序
    sort($arr);
    //返回字符串
    return implode(&#39;&#39;, $arr);
}

9.遍历一个文件下的所有文件和子文件夹下的文件

function AllFile($dir){
    if($dh = opendir($dir)){
        while (($file = readdir($dh)) !== false){
            if($file !=&#39;..&#39; && $file !=&#39;.&#39;){
                if(is_dir($dir.&#39;/&#39;.$file)){
                    AllFile($dir.&#39;/&#39;.$file);    //如果判断还是文件,则递归
                }else{  
                    echo $file;         //输出文件名
                }
            }
        } 
    }
}

10.从一个标准的Url提取出文件的扩展名

function getExt($url)
 {
 $arr = parse_url($url);
 $file = basename($arr[&#39;path&#39;]);// basename函数返回路径中的文件名部分
 $ext = explode(&#39;.&#39;, $file);
 return $ext[count($ext)-1];
 }

11.有个人想上一个n级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台阶走完?例如:总共3级台阶,可以先迈1级再迈2级,或者先迈2级再迈1级,或者迈3次1级总共3中方式

function jieti($num){   //实际上是斐波那契数列
 return $num<2?1:jieti($num-1)+jieti($num-2);
 }

12.请写一段PHP代码,确保多个进程同时写入同一个文件成功

13.无限级分类

function tree($arr,$pid=0,$level=0){
 static $list = array();
 foreach ($arr as $v) {
 //如果是顶级分类,则将其存到$list中,并以此节点为根节点,遍历其子节点
 if ($v[&#39;pid&#39;] == $pid) {
 $v[&#39;level&#39;] = $level;
 $list[] = $v;
 tree($arr,$v[&#39;id&#39;],$level+1);
 }
 }
 return $list;
 }

14.获取上个月第一天 和 最后一天//获取上个月第一天

date(&#39;Y-m-01&#39;,strtotime(&#39;-1 month&#39;));
  
 //获取上个月最后一天
 date(&#39;Y-m-t&#39;,strtotime(&#39;-1 month&#39;)); 15.随机输入一个数字能查询到对应的数据区间//把区间换成数组写法,用二分法查找区间
 function binsearch($x,$a){  
 $c=count($a);  
 $lower=0;  
 $high=$c-1;  
 while($lower<=$high){  
 $middle=intval(($lower+$high)/2);  
 if($a[$middle]>=$x){  
 $high=$middle-1;
 }elseif($a[$middle]<=$x ){  
 $lower=$middle+1;
 }   
 }
  
 return &#39;在区间&#39;.$a[$high].&#39;到&#39;.$a[$lower];  
 }
  
 $array = [&#39;1&#39;,&#39;50&#39;,&#39;100&#39;,&#39;150&#39;,&#39;200&#39;,&#39;250&#39;,&#39;300&#39;];
 $a = &#39;120&#39;;
 echo binsearch($a,$array);

推荐教程:《PHP教程》

以上就是PHP 有趣的经典算法的详细内容,更多请关注 第一PHP社区 其它相关文章!


推荐阅读
  • 学习SLAM的女生,很酷
    本文介绍了学习SLAM的女生的故事,她们选择SLAM作为研究方向,面临各种学习挑战,但坚持不懈,最终获得成功。文章鼓励未来想走科研道路的女生勇敢追求自己的梦想,同时提到了一位正在英国攻读硕士学位的女生与SLAM结缘的经历。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了游戏开发中的人工智能技术,包括定性行为和非定性行为的分类。定性行为是指特定且可预测的行为,而非定性行为则具有一定程度的不确定性。其中,追逐算法是定性行为的具体实例。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了Python高级网络编程及TCP/IP协议簇的OSI七层模型。首先简单介绍了七层模型的各层及其封装解封装过程。然后讨论了程序开发中涉及到的网络通信内容,主要包括TCP协议、UDP协议和IPV4协议。最后还介绍了socket编程、聊天socket实现、远程执行命令、上传文件、socketserver及其源码分析等相关内容。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • 本文描述了作者第一次参加比赛的经历和感受。作者是小学六年级时参加比赛的唯一选手,感到有些紧张。在比赛期间,作者与学长学姐一起用餐,在比赛题目中遇到了一些困难,但最终成功解决。作者还尝试了一款游戏,在回程的路上感到晕车。最终,作者以110分的成绩取得了省一会的资格,并坚定了继续学习的决心。 ... [详细]
  • 基于layUI的图片上传前预览功能的2种实现方式
    本文介绍了基于layUI的图片上传前预览功能的两种实现方式:一种是使用blob+FileReader,另一种是使用layUI自带的参数。通过选择文件后点击文件名,在页面中间弹窗内预览图片。其中,layUI自带的参数实现了图片预览功能。该功能依赖于layUI的上传模块,并使用了blob和FileReader来读取本地文件并获取图像的base64编码。点击文件名时会执行See()函数。摘要长度为169字。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 如何使用计算机控制遥控车的步骤和电路制作方法
    本文介绍了使用计算机控制遥控车的步骤和电路制作方法。首先,需要检查发送器的连接器和跳线,以确定命令的传递方式。然后,通过连接跳线和地面,将发送器与电池的负极连接,以实现遥控车的前进。接下来,制作一个简单的电路,使用Arduino命令将连接到跳线的电线接地,从而实现将Arduino命令转化为发送器命令。最后,通过焊接晶体管和电阻,完成电路制作。详细的步骤和材料使用方法将在正文中介绍。 ... [详细]
author-avatar
SADFGHJKSADFV_565
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有