Hanoi塔算法思想解釋

求汗諾塔N個盤子須幾次移動時得到了下面的遞推公式:

a[1] = 1;
a[n] = a[n-1] * 2 + 1;

請教通項公式?



a[1] = 1;
a[n] = a[n-1] * 2 + 1;

可得a[i]= 2^i-1;

證明,採用數學歸納法:
1、猜想a[i]= 2^i-1
2、當i=1時,顯然成立。
3、假設i=k時成立,即 a[k] = 2^k - 1;則:
由a[n] = a[n-1] * 2 - 1;得
   a[k+1] = a[k] * 2 - 1
          = 2^k * 2 - 1
          = 2^(k-1) - 1
故得證。


同時::
漢諾塔問題(又稱河內塔問題)是根據一個傳說形成的一個問題: 

有三根杆子A,B,C。A杆上有N個(N>1)穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至C杆: 

1. 每次只能移動一個圓盤; 
2. 大盤不能疊在小盤上面。 

提示:可將圓盤臨時置於B杆,也可將從A杆移出的圓盤重新移回A杆,但都必須尊循上述兩條規則。 

問:如何移?最少要移動多少次? 
一般取N=64。這樣,最少需移動264-1次。即如果一秒鐘能移動一塊圓盤,仍將需5845.54億年。目前按照宇宙大爆炸理論的推測,宇宙的年齡僅爲137億年。 

在真實玩具中,一般N=8;這將需移動255次。如果N=10,需移動1023次。如果N=15,需移動32767次;這就是說,如果一個人從3歲到99歲,每天移動一塊圓盤,他僅能移動15塊。如果N=20,需移動1048575次,即超過了一百萬次。 
先看hanoi(1, one, two, three)的情況。這時直接將one柱上的一個盤子搬到three柱上。注意,這裏one柱或three柱到底是A、B還是C並不重要,要記住的是函數第二個參數代表的柱上的一個盤被搬到第四個參數代表的柱上。爲方便,將這個動作記爲: 
one =》three 

再看hanoi(2, one, two, three)的情況。考慮到hanoi(1)的情況已經分析過了,可知這時實際上將產生三個動作,分別是: 
one =》two 
one =》three 
two =》three 
很顯然,這實際上相當於將one柱上的兩個盤直接搬到three柱上。 

再看hanoi(3, one, two, three)的情況。分析 
hanoi(2, one , three, two) 
one =》three 
hanoi(2, two, one, three) 
即:先將one柱上的兩個盤搬到two柱上,再將one柱上的一個盤搬到three柱上,最後再將two柱上的兩個盤搬到three柱上。這不就等於將one柱上的三個盤直接搬到three柱上嗎? 

運用歸納法可知,對任意n, 
hanoi(n-1, one , three, two) 
one =》three 
hanoi(n-1, two, one, three) 
就是先將one柱上的n-1個盤搬到two柱上,再將one柱上的一個盤搬到three柱上,最後再將two柱上的n-1個盤搬到three柱上。這就是我們所需要的結果! 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章