汉诺塔c 语言程序代码,汉诺塔c语言程序代码.docx

集团文件版本号:(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);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值