>  기사  >  백엔드 개발  >  PHP에서 하노이탑 문제에 대한 재귀 알고리즘 및 반복 알고리즘 구현

PHP에서 하노이탑 문제에 대한 재귀 알고리즘 및 반복 알고리즘 구현

不言
不言원래의
2018-04-17 14:07:571629검색

이 글에서는 PHP에서 하노이탑 문제의 반복 알고리즘과 재귀 알고리즘을 소개합니다. 이제 필요한 친구들이 참고할 수 있도록 공유하겠습니다

구현 코드


프로그램 코드 주소: https://github.com/ParrySMS/Exp/tree/master/ProLang/hannota

재귀 메서드 hannoRec.phphannoRec.php

<?php/**
 * Created by PhpStorm.
 * User: L
 * Date: 2018-4-15
 * Time: 2:07
 *//** 递归实现
 * @param $id //盘子编号
 * @param $first //起点柱子
 * @param $middle //中介柱子
 * @param $end //终点柱子
 */function hanRec($id, $first, $middle, $end,$counter){
    if ($id == 1) {
        move(1,$first,$end,$counter);
    } else {
        hanRec($id-1,$first,$end,$middle,$counter);
        move($id,$first,$end,$counter);        $counter++;
        hanRec($id-1,$middle,$first,$end,$counter);
    }
}function move($id,$from,$to,$counter){
    global $counter;    $counter++;   // echo "step: $counter, level $id from $from move to $to, <br/>";}

迭代法 hannoIter
<?php/**
 * Created by PhpStorm.
 * User: L
 * Date: 2018-4-17
 * Time: 2:38
 */class Params{ //定义一个对象来保存参数状态
    public $id;    public $num;    public $first;    public $middle;    public $end;    public $counter;    /**
     * Params constructor.
     * @param $num
     * @param $first
     * @param $middle
     * @param $end
     * @param $counter
     */
    public function __construct($id,$num, $first, $middle, $end, $counter)
    {
        $this->id = $id;        $this->num = $num;        $this->first = $first;        $this->middle = $middle;        $this->end = $end;        $this->counter = $counter;
    }

}function hanIter($id,$num, $first, $middle, $end, $counter){
    $stack =init($id,$num, $first, $middle, $end, $counter);    while($stack){        //出栈
        $action = array_pop($stack);       // var_dump($action);
        if($action->num ==1){
            move($action->id,$action->first,$action->end,$action->counter);
        }else{            //入栈
            $next_stack = init($action->id,$action->num,$action->first, $action->middle, $action->end, $action->counter);            $stack=array_merge($stack,$next_stack);
        }
    }

}/** 入栈操作
 * @param $id //需要移动的盘子
 * @param $num //移动该盘子需要挪动的总盘子数量
 * @param $first
 * @param $middle
 * @param $end
 * @param $counter
 * @return array
 */function init($id,$num,$first, $middle, $end, $counter){
    unset($stack);    //注意入站出站顺序
    $stack = array();    //第一次回调
    $stack[] =new Params($id-1,$num-1,$middle,$first,$end,$counter);    //第二次回调
    $stack[] =new Params($id,1,$first, $middle, $end, $counter);    //第三次回调
    $stack[] =new Params($id-1,$num-1,$first,$end,$middle,$counter);    return $stack;

}/** 若在测试用例中,由于两个文件都有此 move函数,函数重名,注释掉其中一个即可 

function move($id,$from,$to,$counter){
    global $counter;
    $counter++;
   // echo "step: $counter, level $id from $from move to $to, <br/>";
}

**/


반복 메서드 hannoIter

<?php/**
 * Created by PhpStorm.
 * User: L
 * Date: 2018-4-17
 * Time: 2:18
 */require "hannoRec.php";require "hannoIter.php";



define(&#39;TIMES&#39;, 100);
define(&#39;NUM&#39;, 10);function rowTable(){
    unset($row);    $row = array();    for ($i = 0; $i < TIMES; $i++) {    $row = getSortRow($row);
    }    foreach ($row as $r) {        print <<< TR
 <tr>
       <td>$r->iter</td>
       <td>$r->rec</td>
    </tr>
TR;
    }
}function getSortRow(array $row){
    $num = NUM;    $counter= 0;    $stime = microtime(true);
    hanIter($num, $num, &#39;A&#39;, &#39;B&#39;, &#39;C&#39;, $counter);    $etime = microtime(true);    $iterTime = 1000 * ($etime - $stime);//    echo "<br/>";
    $counter = 0;    $num = NUM;    $stime = microtime(true);
    hanRec($num, &#39;A&#39;, &#39;B&#39;, &#39;C&#39;, $counter);    $etime = microtime(true);    $recTime = 1000 * ($etime - $stime);    $row[] = (object)["iter" => $iterTime, "rec" => $recTime];    return $row;
}?><table border="1">
    <tr>
        <th>迭代 Iter/ms</th>
        <th>递归 Rec/ms</th>
    </tr>    <?php rowTable(); ?></table>

실행 시간 테스트 스크립트 test.php

rrreee

Reference반복 방법 아이디어:

https://wenku.baidu.com/view/dce79165b0717fd5360cdcdb.html

관련 권장 사항:

PHP 재귀 함수 분석 예

PHP 재귀 알고리즘 단순화


🎜🎜

위 내용은 PHP에서 하노이탑 문제에 대한 재귀 알고리즘 및 반복 알고리즘 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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