漢諾塔的原理剖析以及遞迴的解決辦法
漢諾塔:源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動一個圓盤。
如果移動一個圓盤需要1秒鐘的話,等到64個圓盤全部重新落在一起,宇宙被毀滅是什麼時候呢?
讓我們來考慮一下64個圓盤重新摞好需要移動多少次吧。1個的時候當然是1次,2個的時候是3次,3個的時候就用了7次......這實在是太累了
因此讓我們邏輯性的思考一下吧。
3個的時候能夠移動最大的3盤時如圖所示。
到此為止用了7次。
接下來如右圖,在上面再放上
因此,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)次。
因此,如果移動一個圓盤需要
宇宙的壽命=2的64次方減1(秒)
2的64次方減1到底有多大呢?動動計算器,答案是一個二十位的數字約是
1.84467440*10^19
用一年=60秒x60分x24小時x365天來算的話,大約有5800億年吧。
太陽及其行星形成於50億年前,其壽命約為100億年。
由此可見,該問題是一個世界性的難題。那麼接下來我們用c#解決一下,原始碼如下:
using UnityEngine;
using System.Collections;
publicclass Script1 : MonoBehaviour {
int aa=0;
void hannuota(string a,string b,string c,
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);
}
}