Heim  >  Artikel  >  tägliche Programmierung  >  PHP klassischer interessanter Algorithmus

PHP klassischer interessanter Algorithmus

angryTom
angryTomOriginal
2019-07-16 15:12:3917524Durchsuche

Viele Leute haben beim Erlernen der C-Sprache einige interessante Algorithmen geschrieben. Tatsächlich können diese Algorithmen auch in PHP implementiert werden, und der Code einiger Algorithmen ist sogar einfacher als der in der C-Sprache.

Für weitere PHP-Tipps klicken Sie bitte hier

1 Eine Gruppe Affen stellt sich im Kreis auf, drücken Sie 1, 2 ,...,n werden fortlaufend nummeriert. Dann beginnen Sie mit dem Zählen vom ersten, zählen Sie bis zum m-ten, werfen Sie es aus dem Kreis, beginnen Sie von hinten zu zählen, zählen Sie bis zum m-ten, werfen Sie es raus ... und fahren Sie auf diese Weise bis zum Ende fort Es gibt nur noch einen Affen, den man „König“ nennt. Um diesen Prozess zu simulieren, ist eine Programmierung erforderlich. Geben Sie m und n ein und geben Sie die Nummer des letzten Königs aus.

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. Es gibt eine Kuh, die schon mit 4 Jahren Kinder zur Welt bringen kann. Jedes Jahr wird eine Kuh geboren. Sie bringen alle dieselbe Kuh zur Welt. Sie werden im Alter von 15 Jahren sterilisiert und können keine 20 Kühe mehr gebären. Wenn ein Mensch im Alter von n Jahren stirbt, wie viele Kühe wird er nach n Jahren haben?

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. Yang Hui Dreieck

<?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. Blasensortierung

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.Schnelle Sortierung

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. Binärer Suchalgorithmus (halber Suchalgorithmus)

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-Singular-Algorithmus

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

Versionen unter PHP7 geben 6 zurück und Versionen unter PHP7 geben 5 zurück, was wirklich seltsam ist. Persönlich ist der zugrunde liegende Algorithmus schlecht, und ich denke, dass es sich bei Versionen unter PHP7 um einen Fehler handelt

8. Zeichensatz: Geben Sie eine Zeichenfolge ein, suchen Sie den in der Zeichenfolge enthaltenen Zeichensatz und sortieren Sie ihn in der richtigen Reihenfolge (Englisch)

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

9 die Zeichen in einer Datei Alle Dateien und Dateien in Unterordnern

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. Extrahieren Sie die Dateierweiterung aus einer Standard-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];
  }

Ja Eine Person möchte n Stufen hinaufsteigen, kann aber jeweils nur 1 oder 2 Stufen schaffen. Frage: Auf wie viele Arten kann diese Person die Stufe bewältigen? Zum Beispiel: Es gibt insgesamt 3 Schritte. Sie können zuerst Schritt 1 und dann Schritt 2 ausführen, oder zuerst Schritt 2 und dann Schritt 1 oder Schritt 1, Stufe 3, also insgesamt 3 Möglichkeiten.

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

12. Bitte schreiben Sie einen PHP-Code, um sicherzustellen, dass mehrere Prozesse gleichzeitig dieselbe Datei erfolgreich schreiben können

<?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);
?>

Unbegrenzte Klassifizierung

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. Holen Sie sich den ersten und letzten Tag des letzten Monats

//获取上个月第一天
    date(&#39;Y-m-01&#39;,strtotime(&#39;-1 month&#39;));
 
    //获取上个月最后一天
    date(&#39;Y-m-t&#39;,strtotime(&#39;-1 month&#39;));

15. Geben Sie zufällig eine Zahl ein, um das entsprechende Datenintervall abzufragen

//把区间换成数组写法,用二分法查找区间
	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);

Das obige ist der detaillierte Inhalt vonPHP klassischer interessanter Algorithmus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn