问题阐述:假设有3个命名为A、B、C的塔座,在塔座A上有n个直径大小各不相同、以小到大编号为1,2,到n的圆盘,现要求将A上的n个圆盘移到C上并仍然按同样的顺序叠排,圆盘移动时必须遵循下列规则: 每次只能移动一个圆盘 圆盘可以移至A、B、C的任一塔座上 任何时候都不能将一个叫大的圆盘压到较小的圆盘上 求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;
}