>백엔드 개발 >PHP 튜토리얼 >PHP의 고전적인 알고리즘 질문의 차이점

PHP의 고전적인 알고리즘 질문의 차이점

小云云
小云云원래의
2017-11-09 15:40:153176검색

PHP의 알고리즘은 매우 강력하다고 할 수 있습니다. 어떤 사람들은 PHP와 같은 프로그래밍 언어를 배우고 싶다면 논리적 사고가 좋아야 한다고 말합니다. 그렇다면 모든 프로그래머는 다음 질문을 살펴봐야 합니다!

5명이 사과 한 다발을 훔쳐 다음날 전리품을 나누기로 계획했습니다. 저녁에 한 남자가 나가서 모든 야채와 과일을 5등분했는데, 나머지 1등분은 나무에 있는 원숭이에게 던지고 1/5을 먼저 숨겼습니다. 놀랍게도 나머지 4명도 같은 생각을 했고, 모두 첫 번째 사람처럼 5등분하여 남은 조각을 원숭이에게 던져 1/5을 훔쳤습니다. 다음 날, 모두가 전리품을 나누어 갖고, 그것도 5등분하여 하나를 더 원숭이에게 던졌습니다. 마지막 사람이 몫을 얻었습니다. 질문: 사과가 몇 개 있나요?

for ($i = 1; ; $i++)
{
    if ($i%5 == 1) {
        //第一个人取五分之一,还剩$t
        $t = $i - round($i/5) - 1;      
        if($t % 5 == 1)
        {
            //第二个人取五分之一,还剩$r
            $r = $t - round($t/5) - 1;      
            if($r % 5 == 1)
            {
                //第三个人取五分之一,还剩$s
                $s = $r - round($r/5) - 1;              
                if($s % 5 == 1)
                {
                    //第四个人取五分之一,还剩$x
                    $x = $s - round($s/5) - 1;                  
                    if($x % 5 == 1)
                    {
                        //第五个人取五分之一,还剩$y
                        $y = $x - round($x/5) - 1;                      
                        if ($y % 5 == 1) {
                            echo $i;
                            break;
                        }
                    }
                }
            }
        }
    }
  }

원숭이 무리가 원을 그리며 줄을 서고 1, 2,...,n에 따라 번호가 매겨져 있습니다. 그런 다음 첫 번째부터 세기 시작하고, m 번째까지 세고, 원 밖으로 쫓아내고, 뒤에서 세기 시작하고, m 번째까지 세고, 쫓아내고... 끝까지 이런 식으로 계속합니다. 이제 원숭이는 한 마리밖에 남지 않았는데, 그 원숭이를 왕이라고 부릅니다. 이 과정을 시뮬레이션하여 m, n을 입력하고 마지막 왕의 수를 출력하는 프로그래밍이 필요합니다.

function king($n, $m){
    $monkeys = range(1, $n);
    $i=0;
    $k=$n;
    while (count($monkeys)>1) {
        if(($i+1)%$m==0) {
            unset($monkeys[$i]);
        } else {
            array_push($monkeys,$monkeys[$i]);
           unset($monkeys[$i]);
       }
       $i++;
   }
   return current($monkeys);
}
$a = king(5, 2);
var_dump($a);

하노이 타워(하노이 타워라고도 함)는 인도의 고대 전설입니다. 세상을 창조한 브라흐마가 세 개의 다이아몬드 막대를 사원에 남겨두었는데, 첫 번째 것은 64개의 둥근 금 조각으로 덮여 있었고, 나머지는 다른 것보다 작았습니다. 절에서 승려들은 막대기를 하나씩 옮겨가며 보조용으로 사용할 수 있지만 한 번에 하나만 움직일 수 있고 큰 막대기는 움직일 수 없다고 규정되어 있었습니다. 작은 것 위에 놓이세요. 답을 찾으려면 직접 계산을 실행해 보세요. 마지막에 있는 프로그램을 확인하세요. 18446744073709551615라는 엄청난 숫자(원반이 이동한 횟수)에 직면하면 스님들이 평생을 바쳐도 금원반의 이동을 완성하는 것은 불가능할 것 같다.
나중에 이 전설은 하노이 타워 게임으로 발전했습니다.
1 세 개의 극 A, B, C가 있습니다. A폴에는 여러 개의 접시가 있습니다
2. 접시는 한 번에 하나씩 옮기고, 작은 접시는 큰 접시 위에만 쌓을 수 있습니다
3. 접시를 A폴에서 C폴로 모두 옮기세요
. 간단합니다. 이동 규칙에 따라 금 조각을 한 방향으로 이동하면 됩니다.
예를 들어, 3차 하노이 타워의 이동은 A→C, A→B, C입니다. →B, A→C, B→A, B→C, A→C
또한 하노이 탑 문제는 프로그래밍의 고전적인 재귀 문제이기도 합니다.

function hanoi($n,$x,$y,$z){
    if($n==1){
        echo 'move disk 1 from '.$x.' to '.$z."\n";
    }else{
        hanoi($n-1,$x,$z,$y);
        echo 'move disk '.$n.' from '.$x.' to '.$z."\n";
        hanoi($n-1,$y,$x,$z);
    }     
}
hanoi(3,'A','B','C');

PHP를 사용하여 버블 정렬 및 빠른 정렬 알고리즘을 설명합니다. 객체는 배열일 수 있습니다.

//对数组冒泡排序
function bubble_sort($array){
    $count = count($array);
    if ($count <= 0) 
        return false;
        for($i=0; $i<$count; $i++){
            for($j=$count-1; $j>$i; $j–){
            if ($array[$j] < $array[$j-1]){
                $tmp = $array[$j];
                $array[$j] = $array[$j-1];
                $array[$j-1] = $tmp;
        }
    }
}
return $array;
}
function quick_sort($array) {
    if (count($array) <= 1) return $array;
    $key = $array[0];
    $left_arr = array();
    $right_arr = array();
    for ($i=1; $i<count($array); $i++){
 
    if ($array[$i] <= $key)
 
        $left_arr[] = $array[$i];
    else
        $right_arr[] = $array[$i];
    }
    $left_arr = quick_sort($left_arr);
    $right_arr = quick_sort($right_arr);
    return array_merge($left_arr, array($key), $right_arr);
}

PHP를 사용하여 순차 검색 및 이진 검색 알고리즘을 설명합니다. 순차 검색은 효율성을 고려해야 합니다. 객체는 순서가 지정된 배열일 수 있습니다.

//使用二分查找数组中某个元素
function bin_sch($array, $low, $high, $k){
    if ($low <= $high){
        $mid = intval(($low+$high)/2);
        if ($array[$mid] == $k){
            return $mid;
        }elseif ($k < $array[$mid]){
        return bin_sch($array, $low, $mid-1, $k);
    }else{
        return bin_sch($array, $mid+1, $high, $k);
    }
    }
    return -1;
}

PHP 내장 함수를 호출할 수 있는 2차원 배열 정렬 알고리즘 함수를 작성하세요. 보편성이 있어요

function array_sort($arr, $keys, $order=0) {
    if (!is_array($arr)) {
        return false;
    }
    $keysvalue = array();
    foreach($arr as $key => $val) {
        $keysvalue[$key] = $val[$keys];
    }
    if($order == 0){
        asort($keysvalue);
    }else {
        arsort($keysvalue);
    }
    reset($keysvalue);
    foreach($keysvalue as $key => $vals) {
        $keysort[$key] = $key;
    }
    $new_array = array();
    foreach($keysort as $key => $val) {
        $new_array[$key] = $arr[$val];
    }
    return $new_array;
}

만드셨나요? 아직 해보지 않았다면 PHP 알고리즘을 사용하고 위의 방법을 따라 이 질문을 완료하세요.

위 내용은 PHP의 고전적인 알고리즘 질문의 차이점의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.