汉诺塔c语言程序代码递归(c语言编写汉诺塔程序)

http://www.itjxue.com  2023-03-04 10:33  来源:未知  点击次数: 

汉诺塔n=4(4个盘)c语言递归编程代码

?

/****************************

汉诺塔的算法就3个步骤:

第一,把a上的n-1个盘通过c移动到b。

第二,把a上的最下面的盘移到c。a成了空的。

第三,因为n-1个盘全在b上了,所以把b当做a.

重复以上步骤就好了。所以算法看起来就简单多了。

******************************/

#includestdio.h

static?int?m=0;

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

{

????if(n==1)

??????{?

????????m++;

????????printf("第?%d?次移动:\n",?m?);

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

????????}

????else

????{

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

????????m++;

????????printf("第?%d?次移动:\n",?m?);

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

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

????}

}

?

int?main()

{

????int?n=4;

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

???//?scanf("%d",n);

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

????return?0;

}

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语言递归调用汉诺塔

//代码如下:

//说明:A,B,C为三个载体,起始,中间,目的载体为相对的,

//1.将n-1个盘子从起始载体通过目的载体,移动到中间载体

//2.只有最后一个盘子了.你需要将最后一个盘子从起始载体移到目的载体即可

//3.再将n-1个盘子从刚才的中间载体通过起始载体移动到目的载体.完成

//4.在递归时遇到只有1个盘子那直接从起始介质移到目的介质就OK了.

//自己用纸画画吧,不太好理解.明白了就不难了.

#include

#define

DISKA

"A"

#define

DISKB

"B"

#define

DISKC

"C"

void

move(int

num,char

*fromp,char

*mediump,char

*top);

void

mv(char

*fp,char

*tp);

int

main()

{

printf("please

input

the

num

of

disk:");

int

num;

scanf("%d",num);

move(num,DISKA,DISKB,DISKC);

return

0;

}

void

move(int

num,char

*fromp,char

*mediump,char

*top)

{

if(num

==

1)

{

mv(fromp,top);//4

}

else

{

move(num-1,

fromp,

top,

mediump);//1

mv(fromp,top);//2

move(num-1,

mediump,

fromp,

top);//3

}

}

void

mv(char

*fp,char

*tp)

{

printf("%s---%s\n",fp,tp);

}

求C语言汉诺塔源码(递归和非递归都要)

递归算法是我前些天写的,非递归是刚才找的,里面含递归和非递归。\x0d\x0a递归算法:\x0d\x0a#include \x0d\x0a//递归求汉诺塔问题\x0d\x0avoid hanoi(int n, char A, char B, char C, int *time)\x0d\x0a{\x0d\x0aif (n=1)\x0d\x0a{\x0d\x0a hanoi(n-1, A, C, B, time);\x0d\x0a move(A, C);\x0d\x0a (*time)++;\x0d\x0a hanoi(n-1, B, A, C, time);\x0d\x0a }\x0d\x0a}\x0d\x0a//打印出每一步的路径\x0d\x0avoid move(char a, char c)\x0d\x0a{\x0d\x0aprintf(" %c--%c\n", a, c);\x0d\x0a}\x0d\x0a\x0d\x0aint main(void)\x0d\x0a{\x0d\x0aint n, time = 0;;\x0d\x0aprintf("请输入汉诺塔的盘数:");\x0d\x0ascanf("%d", n);\x0d\x0aprintf("%d个盘的汉诺塔移动方法是:", n);\x0d\x0aprintf("\n");\x0d\x0ahanoi(n, 'A', 'B', 'C', time);\x0d\x0aprintf("移动了%d次\n", time);\x0d\x0asystem("pause");\x0d\x0areturn 0;\x0d\x0a}\x0d\x0a\x0d\x0a非递归算法:\x0d\x0a#include \x0d\x0a\x0d\x0a#define MAXSTACK 10 /* 栈的最大深度 */\x0d\x0a\x0d\x0aint c = 1; /* 一个全局变量,表示目前移动的步数 */\x0d\x0a\x0d\x0astruct hanoi { /* 存储汉诺塔的结构,包括盘的数目和三个盘的名称 */\x0d\x0aint n;\x0d\x0achar x, y, z;\x0d\x0a};\x0d\x0a\x0d\x0avoid move(char x, int n, char y) /* 移动函数,表示把某个盘从某根针移动到另一根针 */\x0d\x0a{\x0d\x0aprintf("%d- %d from %c - %c\n", c++, n, x, y);\x0d\x0a}\x0d\x0a\x0d\x0avoid hanoi(int n, char x, char y, char z) /* 汉诺塔的递归算法 */\x0d\x0a{\x0d\x0aif (1 == n)\x0d\x0amove(x, 1, z);\x0d\x0aelse {\x0d\x0ahanoi(n - 1, x, z, y);\x0d\x0amove(x, n, z);\x0d\x0ahanoi(n - 1, y, x, z);\x0d\x0a}\x0d\x0a}\x0d\x0a\x0d\x0avoid push(struct hanoi *p, int top, char x, char y, char z,int n)\x0d\x0a{\x0d\x0ap[top+1].n = n - 1;\x0d\x0ap[top+1].x = x;\x0d\x0ap[top+1].y = y;\x0d\x0ap[top+1].z = z;\x0d\x0a}\x0d\x0a\x0d\x0avoid unreverse_hanoi(struct hanoi *p) /* 汉诺塔的非递归算法 */\x0d\x0a{\x0d\x0aint top = 0;\x0d\x0a\x0d\x0awhile (top = 0) {\x0d\x0awhile (p[top].n 1) { /* 向左走到尽头 */\x0d\x0a push(p, top, p[top].x, p[top].z, p[top].y, p[top].n);\x0d\x0a top++;\x0d\x0a}\x0d\x0aif (p[top].n == 1) { /* 叶子结点 */\x0d\x0a move(p[top].x, 1, p[top].z);\x0d\x0a top--;\x0d\x0a}\x0d\x0aif (top = 0) { /* 向右走一步 */\x0d\x0a move(p[top].x, p[top].n, p[top].z);\x0d\x0a top--;\x0d\x0a push(p, top, p[top+1].y, p[top+1].x, p[top+1].z, p[top+1].n);\x0d\x0a top++;\x0d\x0a}\x0d\x0a}\x0d\x0a}\x0d\x0a\x0d\x0aint main(void)\x0d\x0a{\x0d\x0aint i;\x0d\x0aprintf("递归:\n");\x0d\x0ahanoi(3, 'x', 'y', 'z');\x0d\x0aprintf("非递归:\n");\x0d\x0astruct hanoi p[MAXSTACK];\x0d\x0ac = 1;\x0d\x0ap[0].n = 3;\x0d\x0ap[0].x = 'x', p[0].y = 'y', p[0].z = 'z';\x0d\x0aunreverse_hanoi(p);\x0d\x0a\x0d\x0areturn 0;\x0d\x0a}

(责任编辑:IT教学网)

更多

推荐Painter教程文章