php之汉诺塔递归算法分析和实现
2016-12-31 14:41
288 查看
对于递归,简单来说就是方法内部自己调用自己, 同时也一定有一个结束点. 如果对方法调用栈了解的话,其实是很容易理解方法的调用过程的, 就是从主线程开始调用方法进行不停的压栈和出栈操作. 方法的调入就是将方法压入栈中, 方法的结束就是方法出栈的过程, 这样保证了方法调用的顺序流. 如果跟踪递归的调用情况会发现也是如此, 到最后一定是这个方法最后从栈中弹出回到主线程,
并且结束.
案例 1 - 假设只有一个盘子的时候, 盘子数量 N=1
只有一个步骤 将第1个盘子从A移动到C, 为了对比方便我这样来描述这个步骤:
步骤 盘子编号 从柱子移动 移动到柱子
1 1 A C
案例 2 - 如果有两个盘子, 盘子数量 N = 2
步骤 盘子编号 从柱子移动 移动到柱子
1 1 A B
2 2 A C
3 1 B C
案例 3 - 如果有三个盘子, 盘子数量 N = 3
步骤 盘子编号 从柱子移动 移动到柱子
1 1 A C
2 2 A B
3 1 C B
4 3 A C
5 1 B A
6 2 B C
7 1 A C
如何找出盘子移动的规律 ?
我们要做的最重要的一件事情就是永远要把最底下的一个盘子从 A 移动到 C
看看上面从1个盘子的移动到3个盘子的移动, 在移动记录中,当盘子的编号和盘子数量相同的时候他们的步骤都是从A移动到C (看加粗的部分),其它的步骤对等.
再观察第3个案例中的第 1-3 步 和 第 5-7步
第 1-3 步 目的是从 A 移动到 B 如果我们把 B 当作终点, 那么这里的第 1-3 步理解起来和 第2个案例的三个步骤完全相同, 都是通过一个柱子来移动,和第2个案例比起来在后面加括号来表示
1 1 A C ( A -> B)
2 2 A B ( A -> C)
3 1 C B ( B -> C)
总结:将盘子B变成C即可.
第 5-7 步 目的是从 B 移动到 C 如果我们把 C 当作终点, 那么这里的 5-7 步理解起来和上面也是一样的, 和第2个案例的三个步骤也完全相同.和第2个案例比起来就是:
5 1 B A ( A -> B)
6 2 B C ( A- > C)
7 1 A C ( B -> C)
总结: 将盘子B变成A即可
根据这个演示可以明确几点规律:
1. 当盘子只有一个的时候,只有一个动作 从 A 移动到 C 即结束.
2. 当有N个盘子的时候, 中间的动作都是从 A 移动到 C, 那么表示最下面的第N个盘子移动完毕
3. 中间动作之上都可以认为是: 从 A 移动到 B
4. 中间动作之下都可以认为是: 从 B 移动到 C
2,3,4 可以表示为
1 1 A B
2 2 A C
3 1 B C
参考文档:
http://blog.csdn.net/yafei450225664/article/details/8647908
并且结束.
案例 1 - 假设只有一个盘子的时候, 盘子数量 N=1
只有一个步骤 将第1个盘子从A移动到C, 为了对比方便我这样来描述这个步骤:
步骤 盘子编号 从柱子移动 移动到柱子
1 1 A C
案例 2 - 如果有两个盘子, 盘子数量 N = 2
步骤 盘子编号 从柱子移动 移动到柱子
1 1 A B
2 2 A C
3 1 B C
案例 3 - 如果有三个盘子, 盘子数量 N = 3
步骤 盘子编号 从柱子移动 移动到柱子
1 1 A C
2 2 A B
3 1 C B
4 3 A C
5 1 B A
6 2 B C
7 1 A C
如何找出盘子移动的规律 ?
我们要做的最重要的一件事情就是永远要把最底下的一个盘子从 A 移动到 C
看看上面从1个盘子的移动到3个盘子的移动, 在移动记录中,当盘子的编号和盘子数量相同的时候他们的步骤都是从A移动到C (看加粗的部分),其它的步骤对等.
再观察第3个案例中的第 1-3 步 和 第 5-7步
第 1-3 步 目的是从 A 移动到 B 如果我们把 B 当作终点, 那么这里的第 1-3 步理解起来和 第2个案例的三个步骤完全相同, 都是通过一个柱子来移动,和第2个案例比起来在后面加括号来表示
1 1 A C ( A -> B)
2 2 A B ( A -> C)
3 1 C B ( B -> C)
总结:将盘子B变成C即可.
第 5-7 步 目的是从 B 移动到 C 如果我们把 C 当作终点, 那么这里的 5-7 步理解起来和上面也是一样的, 和第2个案例的三个步骤也完全相同.和第2个案例比起来就是:
5 1 B A ( A -> B)
6 2 B C ( A- > C)
7 1 A C ( B -> C)
总结: 将盘子B变成A即可
根据这个演示可以明确几点规律:
1. 当盘子只有一个的时候,只有一个动作 从 A 移动到 C 即结束.
2. 当有N个盘子的时候, 中间的动作都是从 A 移动到 C, 那么表示最下面的第N个盘子移动完毕
3. 中间动作之上都可以认为是: 从 A 移动到 B
4. 中间动作之下都可以认为是: 从 B 移动到 C
2,3,4 可以表示为
1 1 A B
2 2 A C
3 1 B C
<?php /** * 汉诺塔的递归算法: * 算法思路:假设是A B C三个柱子 * 如果只有一个盘子,那么直接把A上的盘子直接移动到C盘即可 * 如果不止一个盘子,那个步骤如下: * 第一步:将A盘上的n-1个盘子借助C移动到B盘上; * 第二步:将A盘上的第n个盘子移动到C盘上; * 第三步:将B盘上的n-1个盘子借助A移动到C * 第三步移动完成后这个任务就完成啦 */ $count = 1; function hanoi($num,$from,$depend,$to) { if ($num == 1) { move(1,$from,$to); } else { hanoi($num-1,$from,$to,$depend); move($num,$from,$to); hanoi($num-1,$depend,$from,$to); } } function move($n,$from,$to) { global $count; echo "num:".$count++.'->'.$n.'from:'.$from.'to:'.$to."\n"; } $num = 20; hanoi($num,'A','B','C');
参考文档:
http://blog.csdn.net/yafei450225664/article/details/8647908
相关文章推荐
- 汉诺塔非递归算法分析与实现
- PHP MVC模式在网站架构中的实现分析
- php与memcached服务器交互的分布式实现源码分析[memcache版]
- php与memcached服务器交互的分布式实现源码分析[memcache版]
- php-数据分析 余弦相似度实现
- PHP settimelimit0长连接的实现分析
- php采集器分析功能实现
- [转]php与memcached服务器交互的分布式实现源码分析[memcache版]
- PHP与Memcached服务器交互的分布式实现源码分析
- 实用PHP会员权限控制实现原理分析 .
- 【php】利用php函数实现文件上传案例分析
- PHP MVC模式在网站架构中的实现分析
- PHP用SAX解析XML的实现代码与问题分析
- PHP与Memcached服务器交互的分布式实现源码分析
- php与memcached服务器交互的分布式实现源码分析[memcache版]
- php与memcached服务器交互的分布式实现源码分析 [memcache版]
- PHP中实现中文字符进制转换原理分析
- Php实现购物车分析
- Php中文件下载功能实现超详细流程分析
- php与memcached服务器交互的分布式实现源码分析[memcache版]