在b站上看比特大博哥的讲解再加上自己调试着捋了一下,感觉还是自己把代码写下来调试更能看懂也更有体会。
感觉就是类似于数列递推的关系式,先确定三个柱子,以及起始、中转、目的位置。把问题分步处理。把所有盘一个一个按照从上到下从小到大的方式挪到目标柱子上=把最下面的(第n个)盘挪到目标柱子上,把其余剩下的n-1个盘挪到中转位置(设置递归)-目的位置。
A、B、C三个柱子在递归的,把问题分步处理过程中都可以成为起始、中转、目的位置。找那个
话不多说我们来看看代码:
1.move函数,打印从起始-目标位置
void move (char pos1,char pos3)
{
printf("%c->%c",pos1,pos3);
}
2.hanoi函数实现递归(核心代码)
void hanoi(int n,char pos1,char pos2,char pos3)//pos1为起始位置,pos2为中转位置,pos3为目的位置
/*每次调用函数时时A、B、C对应的是固定位置的参数。
在之后的自身调用中改变pos1,pos2,pos3参数的位置则参数名会对应和之前不同的ABC*/
//假设n=3
{
if(n!=1)
{
hanoi(n-1,pos1,pos3,pos2);
/*n=2时pos1-A,pos3-B,pos2-C进入hanoi(n=2参数按1,2,3的位置对应传入ACB)所以
n=1时pos1-A,pos3-C,pos2-B*/
move(pos1,pos3);//从起始转移到目的位置
hanoi(n-1,pos2,pos1,pos3);
}
else
{
move(pos1,pos3);//对于最上面一层盘,目的位对应B
}
3.主函数功能实现:
#include <stdio.h>
int main()
{
int b;
scanf("%d",&b);
hanoi(b,'A','B','C');
}