漢諾塔永遠只有三步:
圖中是最常見的五層(五珠)漢諾塔,其實幾層都是一樣,這裡設為n,冰箱門永遠是漢諾塔上面的m=n-1層。那麼問題來了,怎樣把冰箱門開啟?即:怎樣把圖中的1至4號串珠從a柱移動到b柱?(三根柱子從左至右依次為a、b、c,五顆串珠從小到大依次為1到5)這又變成了一道m層漢諾塔的問題(m=n-1)。你可以繼續用把大象裝冰箱分幾步的思路去考慮m層漢諾塔的解法。推導下去最終就得到了乙個兩層漢諾塔該怎麼移動的問題,
關於漢諾塔的公式:
可以這樣理解:
其中代表把冰箱門開啟又合上,即完成兩次n-1層漢諾塔的過程,
+1 代表移動漢諾塔最下面一層,即把大象裝冰箱的過程。
冰箱門開啟或者合上需要的步數都是一樣的,
都是完成乙個m=n-1層漢諾塔的過程。
----------------- 為什麼 f(n) = 2 f(n-1) + 1,f(1) = 1 是最優的 -----------------
其實用數學歸納法就行了。最基本的情況,即n為1,就不用說了。
現在f(n-1)確實是把n-1個盤子集體挪動的最小步數,我們要證明f(n)是把n個盤子集體挪動的最小步數。
1)在把n個盤子從a移動到c的過程中,必然存在一步,是把最大的盤子從a拿出來。要想把最大的盤子從a移動到別的某個柱子上(b或c),就必須保證剩下的n-1個盤子不能礙事,得好好堆在剩下那個柱子(c或b)上。要保證n-1個盤子都在剩下那個柱子上,至少得付出f(n-1)次移動。
2)在把n個盤子從a移動到c的過程中,必然存在一步,是最大的盤子被放到了c上,而且此後再也沒動過。在這步實行之前,最大的盤子要麼在a要麼在b上,而相應地別的n-1個盤子要麼在b要麼在a上。在這步實施之後,我們只要花至少f(n-1)的步數把n-1個盤子從要麼b要麼a挪動到c上就行了。這些步數必然和1)中的步數不重疊,因為這時候最**子在c上,而1)中最**子在a上。
3)最大的盤子至少被挪動了一次。而且這一次肯定沒被算在1)或2)的「至少f(n-1)步」中,因為後者只挪動較小的那n-1個
盤子。把1),2),3)加起來,就是至少f(n-1) + f(n-1) + 1步。不能再少了。
漢諾塔基礎理解
漢諾塔 tower of hanoi 源於印度傳說中,大梵天創造世界時造了三根金鋼石柱子,其中一根柱子自底向上疊著64片 圓盤。大梵天命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次只能移動乙個圓盤。函式的形參a b c不一定代表的是a...
python 漢諾塔 Python漢諾塔
import turtle class stack def init self self.items def isempty self return len self.items 0 def push self,item def pop self return self.items.pop def ...
漢諾塔合集之漢諾塔3
漢諾塔3 步驟分析 1.當只有乙個圓盤時,要從a到b再到c 2.同樣擴充套件經典漢諾塔問題來看,先把a柱上 n 1 個圓盤,經b移動到c 3.把最後乙個圓盤從a移動到b 4.把c柱上的 n 1 個圓盤,經b移動 移回 到a 5.把b上的最後乙個圓盤從b移到c 6.最後把a上的 n 1 個圓盤經過b移...