c语言汉诺塔函数迭代 汉诺塔迭代算法

c语言用递归实现汉诺塔

见代码注释,还有不懂可以问。

创新互联建站网站建设由有经验的网站设计师、开发人员和项目经理组成的专业建站团队,负责网站视觉设计、用户体验优化、交互设计和前端开发等方面的工作,以确保网站外观精美、成都网站设计、网站建设易于使用并且具有良好的响应性。

#include stdio.h

void move(char x,char y)

{

printf("%c--%c\n",x,y);

}

//hannuota函数的作用:把n个圆盘从one柱子借助two柱子放到three柱子 

void hannuota(int n,char one,char two,char three)

{

if(n==1)//如果只有一个柱子 

move(one,three);//直接移动即可 

else

{

hannuota(n-1,one,three,two);//先把one柱子上的n-1个圆盘借助three柱子移动到柱子two 

move(one,three);//把第一个柱子的剩下那一个(第n个)移动到第三个柱子

//由于原来one柱子上的n-1个圆盘已经移动到了two柱子上,因此不会有圆盘挡住n圆盘出来 

hannuota(n-1,two,one,three);

//最后再把那n-1个圆盘从two柱子借助one柱子移动到three柱子

//(上面第一句话hannuota(n-1,one,three,two)已经移动到了two柱子,因此这里是从two柱子移动到three柱子) 

}

}

int main()

{

int m;

printf("input the number of diskes:");

scanf("%d",m);

printf("The step to move %d diskes:\n",m);

hannuota(m,'A','B','C');

return 0;

}

在C语言中用函数编写汉诺塔

*问题分析与算法设计

这是一个著名的问题,几乎所有的教材上都有这个问题。由于条件是一次只能移动一个盘,且不允许大盘放在小盘上面,所以64个盘的移动次数是:

18,446,744,073,709,551,615

这是一个天文数字,若每一微秒可能计算(并不输出)一次移动,那么也需要几乎一百万年。我们仅能找出问题的解决方法并解决较小N值时的汉诺塔,但很难用计算机解决64层的汉诺塔。

分析问题,找出移动盘子的正确算法。

首先考虑a杆下面的盘子而非杆上最上面的盘子,于是任务变成了:

*将上面的63个盘子移到b杆上;

*将a杆上剩下的盘子移到c杆上;

*将b杆上的全部盘子移到c杆上。

将这个过程继续下去,就是要先完成移动63个盘子、62个盘子、61个盘子....的工作。

为了更清楚地描述算法,可以定义一个函数movedisc(n,a,b,c)。该函数的功能是:将N个盘子从A杆上借助C杆移动到B杆上。这样移动N个盘子的工作就可以按照以下过程进行:

1) movedisc(n-1,a,c,b);

2) 将一个盘子从a移动到b上;

3) movedisc(n-1,c,b,a);

重复以上过程,直到将全部的盘子移动到位时为止。

*程序与程序注释

#includestdio.h

void movedisc(unsigned n,char fromneedle,char toneedle,char usingneedle);

int i=0;

void main()

{

unsigned n;

printf("please enter the number of disc:");

scanf("%d",n); /*输入N值*/

printf("\tneedle:\ta\t b\t c\n");

movedisc(n,'a','c','b'); /*从A上借助B将N个盘子移动到C上*/

printf("\t Total: %d\n",i);

}

void movedisc(unsigned n,char fromneedle,char toneedle,char usingneedle)

{

if(n0)

{

movedisc(n-1,fromneedle,usingneedle,toneedle);

/*从fromneedle上借助toneedle将N-1个盘子移动到usingneedle上*/

++i;

switch(fromneedle) /*将fromneedle 上的一个盘子移到toneedle上*/

{

case 'a': switch(toneedle)

{

case 'b': printf("\t[%d]:\t%2d.........%2d\n",i,n,n);

break;

case 'c': printf("\t[%d]:\t%2d...............%2d\n",i,n,n);

break;

}

break;

case 'b': switch(toneedle)

{

case 'a': printf("\t[%d]:\t%2d...............%2d\n",i,n,n);

break;

case 'c': printf("\t[%d]:\t %2d........%2d\n",i,n,n);

break;

}

break;

case 'c': switch(toneedle)

{

case 'a': printf("\t[%d]:\t%2d............%2d\n",i,n,n);

break;

case 'b': printf("\t[%d]:\t%2d........%2d\n",i,n,n);

break;

}

break;

}

movedisc(n-1,usingneedle,toneedle,fromneedle);

/*从usingneedle上借助fromneedle将N-1个盘子移动到toneedle上*/

}

}

用C语言代码来编写含汉诺塔问题,利用堆栈来实现.求代码

算法思想

对于汉诺塔问题,当只移动一个圆盘时,直接将圆盘从 A 针移动到 C 针。若移动的圆盘为 n(n1),则分成几步走:把 (n-1) 个圆盘从 A 针移动到 B 针(借助 C 针);A 针上的最后一个圆盘移动到 C 针;B 针上的 (n-1) 个圆盘移动到 C 针(借助 A 针)。每做一遍,移动的圆盘少一个,逐次递减,最后当 n 为 1 时,完成整个移动过程。

因此,解决汉诺塔问题可设计一个递归函数,利用递归实现圆盘的整个移动过程,问题的解决过程是对实际操作的模拟。

程序代码

#include stdio.h

int main()

{

int hanoi(int,char,char,char);

int n,counter;

printf("Input the number of diskes:");

scanf("%d",n);

printf("\n");

counter=hanoi(n,'A','B','C');

return 0;

}

int hanoi(int n,char x,char y,char z)

{

int move(char,int,char);

if(n==1)

move(x,1,z);

else

{

hanoi(n-1,x,z,y);

move(x,n,z);

hanoi(n-1,y,x,z);

}

return 0;

}

int move(char getone,int n,char putone)

{

static int k=1;

printf("%2d:%3d # %c---%c\n",k,n,getone,putone);

if(k++%3==0)

printf("\n");

return 0;

}

c语言 汉诺塔 函数递归调用

先调用一次hanoi(m,'A','B','C'),其中参数m是你输入的值.

如果你输入的m为1,则直接调用move(one,three),然后直接输入 A--C换行

如果你输入的m不为1,假设为2,则执行过程如下

执行一次hanoi(1,one,three,two),执行 move(one,three),然后直接输出A--B换行

执行一次move(one,three),然后直接输出 A--C换行

执行一次hanoi(1,two,one,three),执行move(one,three),然后直接输出B--C换行

如果你输入的数字2那就相应的进入到更多层的hanoi()函数中循环

C语言汉诺塔程序

将以下内容全部复制到新建的源文件中:(本人自己写的,因为你那课本上的代码,没解释,书写不规范,很难理解清楚,所以我直接新写了一个完整的代码,附带详细说明)

#include stdio.h

//汉诺塔x层塔从A塔整体搬到C塔,中间临时B塔。

//x层塔是从大到小往上叠放。每次移动只能移动一层塔。并且在移动过程中必须保证小层在上边

//借助B塔可以将x层塔全部从A搬到C上,并且符合要求(在移动过程中大的那块在下边,小的那块在上边)

int main()

{

void tower(int x,char a,char b,char c); //声明函数

int x=5,a='A',b='B',c='C'; //x表示有5层塔,具体要多少层自己修改这个值。abc分别表示ABC塔。

tower(x,a,b,c); //x层塔从a移动到c的全过程,主程序只有这条有效语句

return 0;

}

//以下是tower函数的定义

//参数解析:x层塔放在a上,b是中间塔,c是目标塔。即x层塔要从a搬到c上。

//此函数实现x层塔从a整体转移到c上。以及这个过程是怎么搬的全部过程。

void tower(int x,char a,char b,char c)

{

if(x==1)printf("将%d从%c放到%c\n",x,a,c); //只有1层塔时,直接从a搬到c上。

else //不止1层塔,则先将x-1层塔从a按照规律搬到b上,再将最后一块从a搬到c上,最后再将b上的x-1层塔按照规律搬到c上。

{

tower(x-1,a,c,b); //先将x-1层塔从a按照规律搬到b上,注意参数b放在最后,因为放在最后的参数是准备搬过去的目标塔。

printf("将%d从%c放到%c\n",x,a,c); //将最后一块从a搬到c上

tower(x-1,b,a,c); //最后再将b上的x-1层塔按照规律搬到c上,注意参数b放在开头,因为x-1层是要从b上搬过去的。

}

}

C语言函数递归调用汉诺塔问题

#includestdio.h

void move(int n,char a,char b,char c)

{

if(n==1)

printf("\t%c-%c\n",a,c);    //当n只有1个的时候直接从a移动到c

else

{

move(n-1,a,c,b);            //第n-1个要从a通过c移动到b

printf("\t%c-%c\n",a,c);

move(n-1,b,a,c);            //n-1个移动过来之后b变开始盘,b通过a移动到c,这边很难理解

}

}

main()

{

int n;

printf("请输入要移动的块数:");

scanf("%d",n);

move(n,'a','b','c');

}


网站名称:c语言汉诺塔函数迭代 汉诺塔迭代算法
本文网址:http://ybzwz.com/article/hhdcjj.html