漢諾塔遞迴解法

2021-09-25 22:00:23 字數 913 閱讀 9926

解題思路:

1)當只有乙個圓盤時,只需將其從**塔a移至目標塔c(不需要借助輔助塔b)

2)當有兩個圓盤時,需要先把1號圓盤移至輔助塔b,將2號圓盤移至目標塔c,再將輔助塔b上的1號圓盤移至目標塔c即可。

3)當有三個圓盤時,需要先把1號~2號圓盤移至輔助塔b,將3號圓盤移至目標塔c,再將輔助塔b上的1號~2號圓盤借助**塔a移至目標塔c即可。

n)當有n個圓盤時,需要先把1號~(n-1)號圓盤移至輔助塔b,再將n號圓盤移至目標塔c,再將輔助塔b上的1號~(n-1)號圓盤借助**塔a移至目標塔c即可。

綜上:只有第一種情況不需要借助輔助塔b,其餘情況都是一樣的模式,這就滿足了遞迴的三要素----->

**實現:

var hanoi = function (n,src,aux,dst)  from $ to $`)  // 遞迴結束時的處理

} else from $ to $`) // 2.將第n個圓盤從**塔a移動至目標塔c

hanoi(n-1,aux,src,dst) // 將第1步中輔助塔b中的圓盤(前n-1個)藉由**塔a移動至目標塔c

}}hanoi(3,"a","b","c")

src代表**塔,aux代表輔助塔,dst代表目標塔。上述**最核心的是理解每次呼叫hanoi方法時傳入的後三個引數的順序。第乙個引數代表本次移動第幾個圓盤,第二個引數代表本次移動的圓盤是從哪個塔來的,第三個引數代表本次移動的圓盤借助了哪個塔來移動,第四個引數代表本次移動的圓盤最後要移動到哪個塔去。

解題思路參考自:經典遞迴解決漢諾塔!——喜歡特別冷的冬天下著雪

漢諾塔的遞迴解法

遇到這題,就覺得我的理解能力和表達能力不行,用了好長時間把這題弄懂,然而又不知道怎麼用語言表述。要先找到 n 1的是基例,當只有一塊時,直接從a移動到c就完成了 然後再解決n的問題,都可以看成 先把 a柱 n 1 個盤子,先從a 移動到b,再將a最後乙個盤子從a 移動到c,最後將n 1個盤子從b移動...

漢諾塔遞迴及非遞迴解法

1.經典遞迴解法 include void mov char a,char b void recursive hanoi int n,char a,char b,char c int main 2.非遞迴解法 從漢諾塔的遞迴解法可以看出,它跟二叉樹中序遍歷遞迴解法是乙個道理。既然二叉樹非遞迴解法能寫...

漢諾斯塔問題遞迴解法

漢諾斯塔問題遞迴解法主要是把2個盤子的移動推到了n個盤子的移動。n個盤子就相當於將下面最大的盤子和上面的n 1個盤子當作兩個盤子來處理,然後將n 1個盤子繼續分解為第n 1個盤子和其上面的n 2個盤子的移動過程。以此類推,直至最上面的兩個盤子的移動。這就有遞迴的思想在裡面,從而我們可以通過程式來實現...