漢諾塔的原理剖析以及遞歸的解決辦法

漢諾塔:源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞着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);
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章