> 일일 프로그램 > PHP 지식 > PHP 클래식 흥미로운 알고리즘

PHP 클래식 흥미로운 알고리즘

angryTom
풀어 주다: 2019-11-07 18:02:35
원래의
17692명이 탐색했습니다.

많은 사람들이 C 언어를 배울 때 흥미로운 알고리즘을 작성했습니다. 실제로 이러한 알고리즘은 PHP에서도 구현할 수 있으며 일부 알고리즘의 코드는 C 언어의 코드보다 훨씬 간단합니다.

더 많은 PHP 팁을 보려면 우리를 클릭하세요

1. 원숭이 원을 그리며 배열하고 1, 2,...,n에 따라 순차적으로 번호를 매깁니다. 그런 다음 첫 번째부터 세기 시작하고, 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 singular Algorithm

<?php
function test(){
 $a=1;
 $b=&$a;
 echo (++$a)+(++$a);
}
test();
로그인 후 복사
PHP7 이하 버전은 6을 반환하고, PHP7 버전은 5를 반환합니다. 이상합니다. 저는 개인적으로 기본 알고리즘이 좋지 않다고 생각합니다. PHP7


8 이하 버전에서는 버그인 것 같습니다. 문자열을 수집하고 순서대로 정렬합니다(영어)

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에서 파일 확장자를 추출하세요. 한 번에 1~2단계만 수행할 수 있습니다. 질문: 이 사람이 단계를 완료할 수 있는 방법은 몇 가지입니까? 예: 총 3단계가 있습니다. 1단계를 먼저 수행한 다음 2단계를 수행하거나, 2단계를 먼저 수행한 다음 1단계를 수행하거나, 1단계를 3번 수행하여 총 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 지난달 1일과 마지막 날을 가져옵니다.

//获取上个月第一天
    date(&#39;Y-m-01&#39;,strtotime(&#39;-1 month&#39;));
 
    //获取上个月最后一天
    date(&#39;Y-m-t&#39;,strtotime(&#39;-1 month&#39;));
로그인 후 복사
15. 임의의 1을 입력하세요. 숫자는 해당 데이터 간격을 쿼리할 수 있습니다

//把区间换成数组写法,用二分法查找区间
	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.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿