理解汉诺塔
来源:互联网 发布:软件需求工程师转行 编辑:程序博客网 时间:2024/06/05 04:06
1.汉诺塔可以理解为一个移动塔的游戏,把一个n层的塔从一个柱子移动到另一个柱子上
2.这就是汉诺塔递归原型 hannuota(n, A,C)–n层的塔从A柱移动到C柱;每次必须回归到这个原型才算一次递归完成!
<就像1-100的递归累加f(n)=f(n-1)+n; 此时f(n)是递归原型,回归到f(n-1)>
3.中间需要借助一个柱子B,汉诺塔原型写成hunnuota(n,A,B,C)–n层塔从A柱借助B柱移动到C柱;
4.递归都要求有一个出口,也即是控制条件,当n=1时直接把塔从A移动到C即可,这就是出口
<如果n=2则需要移动两次才行,无法一次完成,不能出去>
5.n>1时,这一步是理解汉诺塔递归的关键,必须形成n-1层往C柱移动的形式,分为三步:
a. n层无法一次移动,那么可以理解为先把A上面的n-1层移动到B柱(hannuota(n-1,A,C,B))
b A柱剩下第n层的塔移动到C,
C 然后形成B柱上的n-1层移动到C柱上–
(hannuota(n-1,B,A,C)此时已经形成了递归的原型 不同的只是中间借助的柱子不同罢了!
下面是php代码跟C代码:
function han($n,$a,$b,$c){ if($n==1){ move($a,1,$c); }else{ han($n-1,$a,$c,$b); move($a,$n,$c); han($n-1,$b,$a,$c); }}function move($x,$n,$z){ echo 'move disk '.$n.' from '.$x.' to '.$z.'<br/>'; } han(4,'a','b','c');#include <stdio.h>void han( int n, char A, char B, char C) { if(1==n) { printf("把编号为%d的塔从%c柱子上移动到%c柱子上\n",n,A,C); }else { han(n-1, A, C, B); printf("将编号为%d的塔从%c柱子上移动到%c柱子上\n",n,A,C); han(n-1,B, A, C); } }int main(){ char A = 'a'; char B = 'b'; char C = 'c'; int n = 3;han(n,A,B,C);return 0;
0 0
- 理解汉诺塔
- 对汉诺塔的理解
- 汉诺塔 我的理解
- 对汉诺塔的理解
- 理解汉诺塔递归算法
- 汉诺塔问题个人理解
- 理解
- 理解
- 理解
- 理解
- 理解
- 理解
- 理解
- 理解
- 理解
- 理解
- 理解
- 汉诺塔-递归算法深入理解
- UITableView 总结
- 垃圾回收的经典算法
- iOS,Android调用手机QQ与指定用户或公众号聊天界面
- LeetCode - Majority Element
- Facebook: Pop
- 理解汉诺塔
- iOS RunLoop 初识
- iOS开发总结之自定义非等高cell-storyboard
- 制作html源文件查看器
- LeetCode 01 Two Sum
- Python Module_os_操作系统
- Jmeter使用流程及简单分析监控
- 解决 composer 镜像不能访问的问题
- C++ STL之 vector的capacity和size属性区别