国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 邏輯算法 > 正文

PHP漢諾塔問題的遞歸算法的實現和迭代算法的實現

2020-03-22 18:53:38
字體:
來源:轉載
供稿:網友

這篇文章介紹的內容是關于PHP漢諾塔問題的遞歸算法實現和迭代算法實現,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

實現代碼


html' target='_blank'>程序代碼地址:https://github.com/ParrySMS/Exp/tree/master/ProLang/hannota

遞歸法 hannoRec.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/>";}**/

執行時間測試腳本 test.php
<?php/** * Created by PhpStorm. * User: L * Date: 2018-4-17 * Time: 2:18 */require "hannoRec.php";require "hannoIter.php";define('TIMES', 100);define('NUM', 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, 'A', 'B', 'C', $counter);    $etime = microtime(true);    $iterTime = 1000 * ($etime - $stime);//    echo "<br/>";    $counter = 0;    $num = NUM;    $stime = microtime(true);    hanRec($num, 'A', 'B', 'C', $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>
參考

迭代法思路:https://wenku.baidu.com/view/dce79165b0717fd5360cdcdb.html

相關推薦:

php遞歸函數實例分析

PHP遞歸算法簡單化

以上就是PHP漢諾塔問題的遞歸算法的實現和迭代算法的實現的詳細內容,更多請關注 其它相關文章!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 霸州市| 聂拉木县| 汶川县| 富锦市| 务川| 黔江区| 黑龙江省| 成武县| 体育| 阳高县| 三明市| 白河县| 宜阳县| 洛南县| 如东县| 贵德县| 双鸭山市| 弥勒县| 观塘区| 思茅市| 门头沟区| 广安市| 富民县| 安远县| 濉溪县| 社旗县| 宜黄县| 吴江市| 盐亭县| 永善县| 上杭县| 炉霍县| 五台县| 舞钢市| 北海市| 潮州市| 桐柏县| 盘锦市| 九龙坡区| 宜宾县| 平阳县|