集团文件版本号:(M928-T898-M248-WU2669-I2896-DQ586-M1988)
集团文件版本号:(M928-T898-M248-WU2669-I2896-DQ586-M1988)
汉诺塔c语言程序代码
汉诺塔c语言程序代码(通过vc++6.0验证)(附讲解)
让我们先看看代码吧
#include
int hj(int a,int b, int c,int i)
{
int t;
if(i==1)
printf("%d->%d\n",a,c);
else
{t=c;
c=b;
b=t;
hj(a,b,c,i-1);
printf("%d->%d\n",a,b);
t=a;
a=c;
c=t;
t=b;
b=c;
c=t;
hj(a,b,c,i-1);
return 0;
}
}
main()
{
int a,b,c,i;
a=1;
b=2;
c=3;
printf("请输入汉诺塔的盘数");
scanf("%d",&i);
hj(a,b,c,i);
return 0;
}
以上是汉诺塔的代码,该程序主要是运用了递归的思想,比如数学中的f(x)=f(x-1)+f(x-2),在本程序中为:int hj(int a,int b, int c,int i)
{
int t;
if(i==1)
printf("%d->%d\n",a,c);
else
{t=c;
c=b;
b=t;
hj(a,b,c,i-1);
也就是说,我们在这个函数中再次调用这个函数,相当于一个循环,而在再次调用的过程中,i的值变成i-1,就类似于f(x-1),这样层层调用,最终就变成当i=1的时候的值,然后通过运算,计算出想要得到的值。
汉诺塔的数值分析:
我们可以发现,当只有一个盘的时候,我们只需要做1->3(就是把第一个柱子上的最顶端的盘移动到第三根柱子,以下不再解释)
当有两个盘的时候,是1->2 1->3 2->3
三个盘子是:1->3 1->2 3->2 1->3 2->1 2->3 1->3
分析一下可以得出以下结论:
初始值a=1 b=2 c=3
一个盘子就是a->c
两个盘子与一个盘子的关系是:
第一步:b与c交换值,然后打印a->c
第二步:打印a->b
第三步:a与c交换值,b与c交换值,打印a->c
进一步分析,便可以得出以下结论
只要盘子数量为i(i大于1),那么它就有三部分
第一部分,b与c交换值,然后运行i-1
第二部分,打印a->b
第三部分,a与c交换值,b与c交换值,然后运行i-1
程序表示便是:
if(i==1)
printf("%d->%d\n",a,c);
else
{t=c;
c=b;(交换值)
b=t;
hj(a,b,c,i-1);
printf("%d->%d\n",a,b);
t=a;
a=c;
c=t;(a c交换)
t=b;
b=c;
c=t;(b c交换)
hj(a,b,c,i-1);