递归和迭代_用 递归 与 迭代 实现汉诺塔问题(PHP实现)

汉诺塔问题

汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置N个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。

08c7918fdcb69ef04369a3740c1ba2f6.png

实现代码

点击即可即可跳转到Github程序代码

递归法 hannoRec.php

递归法的本质,就是找到最简单的小规模解,以及一个递推关系式,然后每一次更大规模的问题就去递归到小问题上来解决。

3d6e619e8920e33db8fb83aa1ba8ff5b.png

迭代法 hannoIter

迭代法,则是将问题中,求解的一系列行为动作封装起来,使用一个循环来不停的调用这个行为,并且保存好行为前后的参数状态,使之成为一个可以连续迭代的操作,进而逐步求出最后的解。

9722022322a1fba0ddca196d4dac8753.png

执行时间测试脚本 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>

作者:Petrick

链接:https://www.imooc.com/article/257761

来源:慕课网

本文首次发布于慕课网 ,转载请注明出处,谢谢合作


版权声明:本文为weixin_29384861原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。