经典的递归问题,以前好长时间都没有理解,这里最好自己动手比划比划。

move()函数中的形参代表A、B、C三个柱子 。

附上图解:

递归问题之汉诺塔_#include


1.第一步:先把前n-1个盘子从A柱子移到B柱子(借助C柱子)

递归问题之汉诺塔_递归_02

2.把第n个盘子从A柱子直接移到C柱子

递归问题之汉诺塔_数据结构_03

3.再把前n-1个盘子从B柱子借助A柱子移到C柱子上

递归问题之汉诺塔_数据结构_04

递归完毕,已完成n个盘子的移动过程。

/*

目的:将n个盘子从A柱子移到C柱子,且小盘子只能在大盘子上面。

*/

#include<stdio.h>
int t=0;
void move(int n, int A, int B, int C)
{
if(n==1)
{
printf("第%d个盘子从%c移到%c\n",n,A,C);
}
else
{
move(n-1, A, C, B);
printf("第%d个盘子从%c移到%c\n",n,A,C);
move(n-1, B, A, C);
}
}
int main()
{
int n;
char c1 = 'A', c2 = 'B', c3 = 'C';

printf("请输入要移动盘子的个数: ");
scanf("%d",&n);

move(n,c1,c2,c3);
}