直接上图开干: 1个盘子直接从A放到C(递归出口),大于1个不管你有多少盘子,我始终把你当成两个盘子,即第n个和第(n-1)个,那就是把(n-1)放到B,把n放到C,再把(n-1)放到C,递归思想大功告成;
直接上代码:
void Prinmove(int num,char a,char b)
{
printf("%d盘:%c->%c\n",num,a,b);
}
void Move(int num,char A,char B,char C) //三根柱子 A,B,C
{
if (num == 1) //当n=1,直接从A->c
{
Prinmove(num,A, C);
return;
}
else
Move(num - 1, A,C,B);//将(n-1)放在B柱子上
Prinmove(num,A, C);//将第n个放在C上
Move(num - 1, B, A, C);//再将(n-1)个从B放到C
}
int main()
{
int num = 0;
printf("请输盘数\n");
scanf("%d", &num);
Move(num,'A','B','C');
system("pause");
return 0;
}
递归不要太纠结每一个函数运行的过程,太复杂容易乱,要从递归本质出发,将其分解成与原问题相似的小问题来解决,比如汉诺塔,始终是n和(n-1)的事儿,将出口找好,整体分解一次,依次递归;