问题阐述:假设有3个命名为A、B、C的塔座,在塔座A上有n个直径大小各不相同、以小到大编号为1,2,到n的圆盘,现要求将A上的n个圆盘移到C上并仍然按同样的顺序叠排,圆盘移动时必须遵循下列规则: 每次只能移动一个圆盘 圆盘可以移至A、B、C的任一塔座上 任何时候都不能将一个叫大的圆盘压到较小的圆盘上 image.png image.png image.png 求f(n),即完成n个圆盘移动所需的步数 若n=1,则将圆盘直接从塔1移动到塔3 否则 1.先将1~n-1个圆盘经过塔3移动到塔2 f(n-1) 2.将n号从塔1移动到塔3 1 3.将1~n-1号从塔2经过塔1移动到塔3 f(n-1) 递归公式:f(n)=2*f(n-1)+1 f(1)=1 代码实现

#include<stdio.h>
int count=0;//用来记录操作次数,此处使用全局变量
void Hanoi(int n,char start,char end,char process)//此处标识符的使用是为了便于读者理解,实际使用时可以适当简化
{
    count++;
    if(n==1)//只剩最后一个盘子(即1号盘)时,直接移动即可
    {
        printf("将盘 1 从 %c 移到 %c.\n",start,end);
        return;
    }
    else
    {//此大括号内的目的、过程、出发都是对本次函数体内的移动过程而言,即对此时n个盘子的移动过程而言
        Hanoi(n-1,start,process,end);//将n-1阶汉诺塔从出发柱移动到过程柱,通过目的柱
        printf("Move plate %d from %c to %c\n",n,start,end);//将最下面的大盘子从出发柱直接移动到目的柱
        Hanoi(n-1,process,end,start);//将n-1阶汉诺塔从过程柱移动到目的柱,通过出发柱
    }
}
int main()
{
    char a='A',b='B',c='C';
    int n;
    printf("想要移动几个盘子?\n"); 
    scanf("%d",&n);
    Hanoi(n,a,c,b);//把n个盘子从A柱移动到C柱,借助B柱
    printf("移动步数为 %d .\n",count);
    return 0;
}