汉诺塔的原理剖析以及递归的解决办法
来源:互联网 发布:做淘宝加盟要多少钱 编辑:程序博客网 时间:2024/05/18 00:37
汉诺塔:源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
如果移动一个圆盘需要1秒钟的话,等到64个圆盘全部重新落在一起,宇宙被毁灭是什么时候呢?
让我们来考虑一下64个圆盘重新摞好需要移动多少次吧。1个的时候当然是1次,2个的时候是3次,3个的时候就用了7次......这实在是太累了
因此让我们逻辑性的思考一下吧。
3个的时候能够移动最大的3盘时如图所示。
到此为止用了7次。
接下来如右图,在上面再放上3个圆盘时还要用7次(把3个圆盘重新放在一起需要的次数)。[2]
因此,4个的时候是
“3个圆盘重新摞在一起的次数”+1次+“3个圆盘重新摞在一起需要的次数”
=2x“3个圆盘重新摞在一起的次数”+1次
=15次。
那么,n个的时候是
2x“(n-1)个圆盘重新摞在一起的次数”+1次。
由于1个的时候是1次,结果n个的时候为(2的n次方减1)次。
1个圆盘的时候2的1次方减1
2个圆盘的时候2的2次方减1
3个圆盘的时候2的3次方减1
4个圆盘的时候2的4次方减1
5个圆盘的时候2的5次方减1
........
n个圆盘的时候2的n次方减1
也就是说,n=64的时候是(2的64次方减1)次。
因此,如果移动一个圆盘需要1秒的话,
宇宙的寿命=2的64次方减1(秒)
2的64次方减1到底有多大呢?动动计算器,答案是一个二十位的数字约是
1.84467440*10^19
用一年=60秒x60分x24小时x365天来算的话,大约有5800亿年吧。
太阳及其行星形成于50亿年前,其寿命约为100亿年。
由此可见,该问题是一个世界性的难题。那么接下来我们用c#解决一下,源码如下:
using UnityEngine;
using System.Collections;
public class Script1 : MonoBehaviour {
int aa=0;
void hannuota(string a,string b,string c,int n){
if (n > 1) {
hannuota (a,c,b,n-1);
Debug.Log(a+"-->"+c);
aa++;
hannuota (b,a,c,n-1);
}
else{
Debug.Log(a+"-->"+c);
aa++;
}
}
void Start(){
hannuota("1","2","3",4);
Debug.Log (aa);
}
}
- 汉诺塔的原理剖析以及递归的解决办法
- JAVA war包部署到tomcat,jar包冲突问题的解决办法,以及原理剖析。
- 灰鸽子的运行原理以及解决办法
- POST上传文件的原理剖析以及实例验证
- Linux 打开文件数1024限制的原理以及解决办法
- 递归函数的原理
- 递归的工作原理
- 测试:递归的原理
- 递归算法的原理
- TCP/IP的原理剖析
- 剖析锂电池的工作原理
- 剖析锂电池的工作原理
- 剖析Jetty的运行原理
- Handler的原理-----源码剖析
- php 的编译原理 剖析
- 浅谈递归过程以及递归的优化
- 剖析C++标准库智能指针(std::auto_ptr) 以及智能指针的原理
- 容斥原理详解 以及代码的剖析 结合实例hdu4135
- SHELL命令
- 华为牛人的十年工作感悟
- Nodejs完成一个待办事项的实例教程
- Unity的设计模式--单例模式,
- Timer和TimerTask
- 汉诺塔的原理剖析以及递归的解决办法
- JS固定表头及固定左边列
- Servlet FileNotFoundException 解决方案
- SEO高质量的伪原创怎么写?
- Matlab 画平滑轮廓 print 高质量 figure
- freopen_s与FILE (菜鸟版)
- poj1679The Unique MST 次小生成树
- iOS复习笔记13:常用数据结构之结构体
- CF 445A Boredom DP