汉诺塔的原理剖析以及递归的解决办法

来源:互联网 发布:做淘宝加盟要多少钱 编辑:程序博客网 时间: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个的时候为(2n次方减1)次。

1个圆盘的时候21次方减1

2个圆盘的时候22次方减1

3个圆盘的时候23次方减1

4个圆盘的时候24次方减1

5个圆盘的时候25次方减1

........

n个圆盘的时候2n次方减1

也就是说,n=64的时候是(264次方减1)次。

因此,如果移动一个圆盘需要1秒的话,

宇宙的寿命=264次方减1(秒)

264次方减1到底有多大呢?动动计算器,答案是一个二十位的数字约是

1.84467440*10^19

用一年=60x60x24小时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);
    }

}

 

0 0
原创粉丝点击