汉诺塔问题是一个典型的递归问题。
递归问题的基本思想:将问题逐步化简为相同思路但是规模更小的问题,直到问题可以直接解决
递归的关键在于基准情形和递归步骤,基准情形也就是退出条件,递归步骤也就是把问题简化为子问题的过程。
对于汉诺塔问题,递归步骤就是:
1. 把 (n-1) 个圆盘从 A 针移动到 B 针(借助 C 针)
2. A 针上的最后一个圆盘移动到 C 针;
3. B 针上的 (n-1) 个圆盘移动到 C 针(借助 A 针)
基准情形就是:
当最后剩一个圆盘的时候,直接移动,无需借住第三根柱子辅助。
#include <stdio.h>
void hanoi(int n, char from, char to, char aux){
if(n==1){
printf("移动圆盘 1 从 %c 到 %c\n", from, to);
return;
}
hanoi(n-1, from, aux, to);
printf("移动圆盘 %d 从 %c 到 %c\n", n, from, to);
hanoi(n-1, aux, to, from);
}
int main() {
hanoi(3, 'A', 'B', 'C');
return 0;
}