這篇文章介紹的內(nèi)容是關(guān)于PHP漢諾塔問題的遞歸算法實現(xiàn)和迭代算法實現(xiàn),有著一定的參考價值,現(xiàn)在分享給大家,有需要的朋友可以參考一下
實現(xiàn)代碼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 *//** 遞歸實現(xiàn) * @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{ //定義一個對象來保存參數(shù)狀態(tài) 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 //移動該盤子需要挪動的總盤子數(shù)量 * @param $first * @param $middle * @param $end * @param $counter * @return array */function init($id,$num,$first, $middle, $end, $counter){ unset($stack); //注意入站出站順序 $stack = array(); //第一次回調(diào) $stack[] =new Params($id-1,$num-1,$middle,$first,$end,$counter); //第二次回調(diào) $stack[] =new Params($id,1,$first, $middle, $end, $counter); //第三次回調(diào) $stack[] =new Params($id-1,$num-1,$first,$end,$middle,$counter); return $stack;}/** 若在測試用例中,由于兩個文件都有此 move函數(shù),函數(shù)重名,注釋掉其中一個即可 function move($id,$from,$to,$counter){ global $counter; $counter++; // echo "step: $counter, level $id from $from move to $to, <br/>";}**/
<?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
相關(guān)推薦:
php遞歸函數(shù)實例分析
PHP遞歸算法簡單化
以上就是PHP漢諾塔問題的遞歸算法的實現(xiàn)和迭代算法的實現(xiàn)的詳細(xì)內(nèi)容,更多請關(guān)注 其它相關(guān)文章!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。
新聞熱點
疑難解答