汉诺塔问题是经典的递推问题,问题的简单描述为:
三根柱子ABC,A上有64个盘子,大的在最下边,晓得在最上边,要把这64个盘子从A上转移到C上并且过程中一直保持晓得在大的上边。
分析过程:
1>假如只有一个盘子,可以直接从A移动到C上,即A-C。
2>假如有两个盘子,则先把A上的小盘子移动到B柱接着把A上的大盘子移动到C柱,最后把B上的小盘子移动到C柱。
A->B
A->C
B->C
3>假如有三个盘子,则情况开始复杂,
A->C
A->B
C->B
A->C
B->A
B->C
A->C
当盘子数量增加的时候,再继续这种分析是非常复杂的,但是根据上面的情况,可以发现其中的规律:
1>先把A柱子上n-1个盘子借助C柱移动到B柱上只有这样,才可以把A上的最大的盘子移动到C上
2>将A柱子上的第n个盘子移动到C柱上。归位。
3>再将B柱上的n-1个盘子借助于A柱移动到C柱上。
这里写一下移动过程:
#include<stdio.h>
void move(char soure,char target) //打印从soure移动到target的函数
{
printf("&c--->%c\n",soure,targert);
}
void hanoi(int n,char A,char B, char C) //递归函数
{
if(n==1)
move(A,C)
else
{
hanoi(n-1,A,C,B);
move(A,C);
hanoi(n-1,B,A,C);
}
}
int main()
{
int n;
scanf("%d",&n);
hanoi(n,'A','B','C');
return 0;
}
在这个代码中,充分利用了递推,函数嵌套函数,实现递推,可谓经典算法