漢諾塔是遞歸教學的經典案例。三根柱子 A、B、C,A 上有 n 個盤子(小上大下),目標將所有盤子移至 C,規則:每次僅移一盤,大盤不得置於小盤上。遞歸解法將 n 盤問題分解為三個 n-1 盤子問題,代碼極其精簡。
基例:n=1 時直接移動。
#includevoid Hanoi(int n, char from, char aux, char to) { if (n == 1) { printf("FROM %c TO %c\n", from, to); // 基例:直接移動 return; } Hanoi(n - 1, from, to, aux); // 步驟 1:n-1 從 from 移到 aux,借助 to printf("FROM %c TO %c\n", from, to); // 步驟 2:第 n 個從 from 移到 to Hanoi(n - 1, aux, from, to); // 步驟 3:n-1 從 aux 移到 to,借助 from } int main() { int n; printf("請輸入漢諾塔盤數: "); scanf("%d", &n); Hanoi(n, 'A', 'B', 'C'); return 0; }
T(n) = 2^n - 1,指數級增長。n=64 時約 1.84×10¹⁹ 步,「世界末日」傳說由此而來。利用棧模擬遞歸,或根據「奇數盤最小盤循環 A→C→B→A,偶數盤 A→B→C→A」的移動規律迭代生成步驟,可避免棧溢出,適合超大 n 場景。
漢諾塔以 10 行代碼展現了遞歸「將大問題分解為相似子問題」的核心哲學。理解其參數角色互換(from/aux/to 輪換)是掌握遞歸參數化設計的關鍵一課。