递归:汉诺塔 · 分而治之
把 n 个盘从 A 经 B 移到 C:先移上 n−1 个到 B → 移最大盘到 C → 再移 n−1 个到 C(n=3 共 2³−1=7 步)
递归三步 Hanoi(n, A→C, 借 B)
① Hanoi(n−1, A → B, 借 C)
把上面 n−1 个盘 A → B
② 移最大盘 A → C
单独把最下面那个盘移到目标
③ Hanoi(n−1, B → C, 借 A)
把 n−1 个盘从 B 移回 C
基准情形:n==1 时直接移一个盘
void Hanoi(int n,char A,char C,char B){
if(n==1){ move(A,C); return; }
Hanoi(n-1, A, B, C); // ①
move(A, C); // ②
Hanoi(n-1, B, C, A); // ③
}
执行
A
B
C
源
辅助
目标
第
0
/ 7 步
完成!3 个盘全部移到 C,共 7 步
▶ 重播