搜尋
首頁後端開發php教程PHP 有趣的經典演算法
PHP 有趣的經典演算法May 30, 2020 am 09:34 AM
php

PHP 有趣的經典演算法

許多人在學習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、楊輝三角

<?php
/* 默认输出十行,用T(值)的形式可改变输出行数 */
class T{
  private $num;
  public function __construct($var=10) {
    if ($var<3) die("值太小啦!");
    $this->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 "<br/>";
    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"<br/>";
    }
  }
}
$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奇異演算法

<?php
function test(){
 $a=1;
 $b=&$a;
 echo (++$a)+(++$a);
}
test();

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程式碼,確保多個進程同時寫入同一個檔案成功

<?php
 $fp = fopen("lock.txt","w+");
 if (flock($fp,LOCK_EX)) {
 //获得写锁,写数据
 fwrite($fp, "write something");
  
 // 解除锁定
 flock($fp, LOCK_UN);
 } else {
 echo "file is locking...";
 }
 fclose($fp);
?>

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中文網其他相關文章!

陳述
本文轉載於:juejin。如有侵權,請聯絡admin@php.cn刪除
php怎么把负数转为正整数php怎么把负数转为正整数Apr 19, 2022 pm 08:59 PM

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

php怎么实现几秒后执行一个函数php怎么实现几秒后执行一个函数Apr 24, 2022 pm 01:12 PM

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php字符串有没有下标php字符串有没有下标Apr 24, 2022 am 11:49 AM

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

php怎么除以100保留两位小数php怎么除以100保留两位小数Apr 22, 2022 pm 06:23 PM

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

php怎么读取字符串后几个字符php怎么读取字符串后几个字符Apr 22, 2022 pm 08:31 PM

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

php怎么根据年月日判断是一年的第几天php怎么根据年月日判断是一年的第几天Apr 22, 2022 pm 05:02 PM

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php怎么替换nbsp空格符php怎么替换nbsp空格符Apr 24, 2022 pm 02:55 PM

方法:1、用“str_replace("&nbsp;","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\&nbsp\;||\xc2\xa0)/","其他字符",$str)”语句。

php怎么查找字符串是第几位php怎么查找字符串是第几位Apr 22, 2022 pm 06:48 PM

查找方法:1、用strpos(),语法“strpos("字符串值","查找子串")+1”;2、用stripos(),语法“strpos("字符串值","查找子串")+1”。因为字符串是从0开始计数的,因此两个函数获取的位置需要进行加1处理。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具