漢諾塔是**遞歸思維**的經典入門,**代碼極短但抽象度高**,初學者常試圖「展開每一步」導致腦內棧溢出。
將 N 個盤子從 A 柱借助 B 柱移到 C 柱:
- 先將上面 N-1 個盤子從 A **借助 C** 移到 B。
- 再將第 N 個(最大)盤子從 A 直接移到 C。
- 最後將 N-1 個盤子從 B **借助 A** 移到 C。
**遞歸終止條件**:N=1 時直接移動。
void hanoi(int n, char from, char aux, char to) {
if (n == 1) {
printf("Move disk 1 from %c to %c\n", from, to); // 步驟 2
return;
}
hanoi(n-1, from, to, aux); // 步驟 1:參數順序變化體現「借助」角色互換
printf("Move disk %d from %c to %c\n", n, from, to); // 步驟 2
hanoi(n-1, aux, from, to); // 步驟 3
}
在線動畫演示:Math is Fun - Tower of Hanoi,可調盤數、步進執行,觀察遞歸調用棧與移動序列對應關係。
2^N - 1(指數級)。**掌握漢諾塔,就是掌握了「分治 + 遞歸 + 參數語義翻轉」的核心模式,可遷移至二叉樹遍歷、DFS、分治排序等眾多問題。**