一、原理分析
三个柱子依次为A、B、C。需要把所有圆盘从A移动至C。
过程分解:
①把上面n-1个圆盘全部从A移动至B。其中,A为起始柱,C为过渡(辅助)柱,B为目标柱。【调用一次hanoi函数】
②把最下面的圆盘从A移动至C。【直接print,无需调用函数】
③把位于B柱上的n-1个圆盘移动至C,此过程中A为过渡(辅助)柱。【调用一次hanoi函数】
二、C语言实现
代码如下(仅供参考):
#include<stdio.h>
void hanoi(int num,char A,char B,char C); //声明函数
int num;
int count=0;
int main(void)
{
printf("Please enter the number:\n");
scanf("%d",&num);
hanoi(num,'A','B','C');
return 0;
}
void hanoi(int num,char A,char B,char C) //第一个位置表示起始柱,第二个表示过渡柱,第三个表示目标柱
{
if (num == 1) //只有一个圆盘的情况
{
printf("第%d步,圆盘编号 %d : %c → %c\n",count+1,1,A,C);
count += 1;
}
else
{
hanoi(num-1,A,C,B); //上面n-1个圆盘全部从A移动到B,其中A为起始柱,C为过渡柱,B为目标柱
printf("第%d步,圆盘编号 %d : %c → %c\n",count+1,num,A,C); //最下面一个圆盘从A移动到C
count += 1;
hanoi(num-1,B,A,C); //上面n-1个圆盘全部从B移动到C,其中B为起始柱,A为过渡柱,C为目标柱
}
}
三、Python实现
原理完全相同,用Python语言再描述一遍。
代码如下(仅供参考):
count=0
def hanoi(n,A,B,C):
global count
if n == 1:
print("第{}步, 圆盘编号 {} : {} → {}".format(count+1,1,A,C))
count += 1
else:
hanoi(n-1,A,C,B)
print("第{}步, 圆盘编号 {} : {} → {}".format(count+1,n,A,C))
count += 1
hanoi(n-1,B,A,C)
print("Please enter the number")
n=int(input(""))
hanoi(n,"A","C","B")