汉诺塔c语言程序代码递归(c语言编写汉诺塔程序)
汉诺塔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}