三个盘子的汉诺塔

然后你移完发现左边柱子下面又蹦出来一个盘子

好吧, 那就把中间的柱子看成目标柱

所以说一共就三步:
把 n-1 号盘子移动到缓冲区
把1号从起点移到终点
然后把缓冲区的n-1号盘子也移到终点

写成C语言代码:

#include <stdio.h>

void f(char a, char b) {
    printf("从%c柱上往%c柱上挪动一个圆盘\n", a, b);
}

void g(int i, char a, char b, char c) {
    if (i == 2) {   //2块圆盘
        f(a, b);    //把a柱子上 最上面的一块    挪动到 b柱子上去 
        f(a, c);    //把a柱子上 最下面(最大)的那一块   挪动到 c柱子上去 
        f(b, c);     //把b柱子上 那一块   挪动到 c柱子上去 
    } else if (i > 2) { //分成a柱子上的圆盘 两部分: ①第i块 圆盘和②i-i块 圆盘
        //i-i块 圆盘那一部分
        g(i - 1, a, c, b);  //把a柱子上的 i-1块 圆盘通过c柱子 挪动到 b柱子上去 
        //第i块 圆盘那一部分
        f(a, c);              //把a柱子上的 第i块(最大的那一块)挪动到 c柱子上去 
        //对于b柱子上的i-i块 圆盘那一部分进行再次递归 转移
        g(i - 1, b, a, c); //把b柱子上的 i-1块 圆盘通过a柱子 挪动到 c柱子上去 
    }
}

int main(void) {
    g(3, 'A', 'B', 'C');
    return 0;
}

运行结果: