面試題 08.06. 漢諾塔問題
思路參考
相傳在很久以前,有個寺廟裡的幾個和尚整天不停地移動著 64 個盤子,日復一日,年復一年。據說,當 64 個盤子全部移完的那一天就是世界末日...有 a,b,c 三根柱子,a 上面有 n 個盤子,我們想把 a 上面的盤子移動到 c 上,但是要滿足以下三個條件:
這是一道遞迴方法的經典題目,乍一想還挺難理清頭緒的,我們不妨先從簡單的入手。
假設n = 1
只有乙個盤子,很簡單,直接把它從 a 中拿出來,移到 c 上;
如果n = 2
呢?這時候我們就要借助 b 了,因為小盤子必須時刻都在**子上面,共需要 4 步。
如果n > 2
呢?思路和上面是一樣的,我們把 n 個盤子也看成兩個部分,一部分有 1 個盤子,另一部分有 n - 1 個盤子。
觀察上圖,你可能會問:「那 n - 1 個盤子是怎麼從 a 移到 c 的呢?」
注意,當你在思考這個問題的時候,就將最初的 n 個盤子從 a 移到 c 的問題,轉化成了將 n - 1 個盤子從 a 移到 c 的問題, 依次類推,直至轉化成 1 個盤子的問題時,問題也就解決了。這就是分治的思想。
而實現分治思想的常用方法就是遞迴。不難發現,如果原問題可以分解成若干個與原問題結構相同但規模較小的子問題時,往往可以用遞迴的方法解決。具體解決辦法如下:
**如下:
package main
func hanota(a int, b int, c int) int
move(len(a),&a,&b,&c)
return c
}// n:要移動的盤子數目a. a,b,c分別代表當前情況下的第1,2,3個柱子
func move(n int ,a,b,c *int)else
}func main()
面試題 08 06 漢諾塔問題
面試題 08.06.漢諾塔問題 簡單題 遞迴 在經典漢諾塔問題中,有 3 根柱子及 n 個不同大小的穿孔圓盤,盤子可以滑入任意一根柱子。一開始,所有盤子自上而下按公升序依次套在第一根柱子上 即每乙個盤子只能放在更大的盤子上面 移動圓盤時受到以下限制 1 每次只能移動乙個盤子 2 盤子只能從柱子頂端滑...
面試題 08 06 漢諾塔問題
在經典漢諾塔問題中,有 3 根柱子及 n 個不同大小的穿孔圓盤,盤子可以滑入任意一根柱子。一開始,所有盤子自上而下按公升序依次套在第一根柱子上 即每乙個盤子只能放在更大的盤子上面 移動圓盤時受到以下限制 1 每次只能移動乙個盤子 2 盤子只能從柱子頂端滑出移到下一根柱子 3 盤子只能疊在比它大的盤子...
面試題 08 06 漢諾塔問題
在經典漢諾塔問題中,有 3 根柱子及 n 個不同大小的穿孔圓盤,盤子可以滑入任意一根柱子。一開始,所有盤子自上而下按公升序依次套在第一根柱子上 即每乙個盤子只能放在更大的盤子上面 移動圓盤時受到以下限制 1 每次只能移動乙個盤子 2 盤子只能從柱子頂端滑出移到下一根柱子 3 盤子只能疊在比它大的盤子...