三九宝宝网宝宝教育教学论文

请教一下c语言汉诺塔问题代码不明白之处

05月01日 编辑 39baobao.com

[c语言超级简单代码编译问题]你的问题在于把函数声明放在了主函数内部,而且函数实现时是不能加;的 而且返回z后,函数的调用结束了. getch();是无用的 #include<stdio.h> int max(int x,int y); void main() {...+阅读

哈哈,给你解释下首先你得明白这是用函数递归调用的方法,递归就不用我说了,看代码void hanoi(int n,char one,char two,char three){void move(char x,char y);if(n==1)move(one,three);//这个if语句,当盘子只有一个的时候,当然直接从第一根柱子(one)移到第//三根柱子(three)上就OK了,move(one,three)就这个意思!else{hanoi(n-1,one,three,two);//当有n个盘子,按照递归法,调用hannoi,先把//上面的n-1个盘子从第一根柱子(one)借助第三根柱子(three)移到第二根柱//子上(two)。move(one,three);//上面已把n-1个盘子移到第二根柱子上了,再将第一根柱//子剩下的一个盘子也就是最大的盘子从one移到three,明白?hanoi(n-1,two,one,three);/*移动好了最大的一个盘子,剩下n-1个盘子在two上,这时我们可以把第二根柱子与第一个柱//子的位置交换下,也就是标号为two的排第一,one排第二,three排第三。

这里的hanoi(n-1,two,one,three)对应void hanoi(int n,char one,char two,char three),只是盘子变成n-1个,标号为two的柱子排第一了,下面要做的就是把two上上面的n-2个盘子借助three移到one上,再把剩下的一个移到第三个,再调换one 和two位置。如此重复!注意转换位置只是我们头脑中的想象,程序本身没有转换柱子位置,编程完全按照标号(one two three)来实现的,我这样写只是便于理解递归过程,不知道是否理解?*/}}void move(char x,char y){printf("%c-->%c\n",x,y);} /*move 函数只是起到一个打印步骤的作用,one对应'A',。。,比如move(one,two),就会打印出A-->B */上面有些是我自己理解时的一些想法,希望能帮到你,实际你把代码对照算法多看几次就OK了,很容易的,理解了自己都可以写出来...

汉诺塔问题用c语言编辑

书上有的#includevoid 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(n>0) { 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

汉诺塔问题的C语言程序应该怎么写

其实主要就是三个步骤:

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

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

第三,因为n-1个盘全在b上了,所以把b当做a重复以上步骤就好了。

#include

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

}

}

int main()

{

int n;

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

scanf("%d",&n);

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

return 0;

}

以下为关联文档:

解释C语言二维数组代码问题楼主你好 其实你的代码很简单,只是有太多的循环嵌套,所以看起来复杂 #include<stdio.h> #include<stdlib.h> #include<time.h> int main() { int a[5][5]; int i,j,m,n,t; pri...

请教C语言内存泄漏问题高手请指教p = (int *)malloc(6 * sizeof(int)) ; *p = i; } printf("这儿p++运行了6次; i<6, *p)!" free(p);n"/由于最后你要释放空间;%2d&quot,一定不要让指针p发生改变;6;/, *(p+i));); } //...

c语言递归问题:汉诺塔问题:假设最初有3个盘子,目标是柱子A移到柱子C上,柱子从左到右是A,B,C,我给你说明一下过程: 1.move(2,a,b);move(1,a,c);move(2,b,c);//将2个盘子从A移到B上,再将剩下的1个从A移到C上,最...

C语言函数递归调用汉诺塔问题我一步步的给你讲,就会懂啦: 首先hanoi函数如果把当中的move函数给去掉,就变成了: 1 2 3 4 5 6 7 8 9 10 11 voidhanoi(intn, charone , chartwo, charthree) { if(n == 1) prin...

C语言递归汉诺塔问题你可以按照这个区理解 我已经写了具体的过程 边看解释边理解吧 希望对你有帮助哦~ # include <stdio.h> void hannuota( int n,char X,char Y,char Z ) { /* 用伪算法描述: i...

c语言汉诺塔函数递归调用先调用一次hanoi(m,'A','B','C'),其中参数m是你输入的值.如果你输入的m为1,则直接调用move(one,three),然后直接输入 A-->C换行如果你输入的m不为1,假设为2,则执行过程如下执行一...

我想问一下汉诺塔的递归C程序怎么弄呢#include#includevoid move(int n,char x,char y,char z) { if(n==1) printf("%c-->%c\n",x,z); else { move(n-1,x,y,z); printf("%c-->%c\n",x,z); move(n-1,y,z,x); } } main...

100财富求讲解达人C语言递归汉诺塔求讲解递归法是一种很方便的算法,你不要太过于纠结过程 hannoi这个函数4个变量,分别是要处理的塔的层数n,和塔a,b,c; a表示原塔,b是目标塔,c是中间的塔; 当n=1时,只有一层,直接移动; 其余情...

求贪吃蛇的C语言代码和C代码求贪吃蛇的C语言代码和C代码,贪吃蛇游戏的源代码:#define N 200 #include #include #include #define LEFT 0x4b00 #define RIGHT 0x4d00 #define DOWN 0x5000 #define UP 0x4...

推荐阅读
图文推荐