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

C语言汉诺塔的问题

05月01日 编辑 39baobao.com

[c语言迷宫问题]问题出在MazePath内部的e是一个局部变量,并且随着while循环其内容不断变化。保存一个局部变量的地址是没有意义的,函数返回后就被清除。解决的办法是动态分配QElemType类型的...+阅读

要看懂递归程序,往往应先从最简单情况看起。

先看hanoi(1, one, two, three)的情况。这时直接将one柱上的一个盘子搬到three柱上。注意,这里one柱或three柱到底是A、B还是C并不重要,要记住的是函数第二个参数代表的柱上的一个盘被搬到第四个参数代表的柱上。为方便,将这个动作记为:

one =》three

再看hanoi(2, one, two, three)的情况。考虑到hanoi(1)的情况已经分析过了,可知这时实际上将产生三个动作,分别是:

one =》two

one =》three

two =》three

很显然,这实际上相当于将one柱上的两个盘直接搬到three柱上。

再看hanoi(3, one, two, three)的情况。分析

hanoi(2, one , three, two)

one =》three

hanoi(2, two, one, three)

即:先将one柱上的两个盘搬到two柱上,再将one柱上的一个盘搬到three柱上,最后再将two柱上的两个盘搬到three柱上。这不就等于将one柱上的三个盘直接搬到three柱上吗?

运用归纳法可知,对任意n,

hanoi(n-1, one , three, two)

one =》three

hanoi(n-1, two, one, three)

就是先将one柱上的n-1个盘搬到two柱上,再将one柱上的一个盘搬到three柱上,最后再将two柱上的n-1个盘搬到three柱上。这就是我们所需要的结果!

C语言汉诺塔高分提问

hanio(n-1,a,c,b);(提问:为什么参数设置为a,c,b)

move(a,c);

hanio(n-1,b,a,c); (提问:而这个又设置成为b,a,c)

其实如果清楚了移动规则,这个就很简单了.

分析有两个盘子的情况,显然为:

a-b

a-c

b-c

假设有n个盘子,我们也可以看作两个盘子,其中最上面的一个为x,下面的n-1个为y,那么这两个盘子的以后就和上面一样

x:a-b

y:a-c

x:b-c

而那n-1个盘子也可以用同样方法处理.这样我们像有了一个公式:

if(n==1)

直接将一个盘子从a移动到c;

else

{

先将n-1个盘子从a移动到b;

把第n个盘子从a移动到c;

将n-1个盘子从b移动到c;

}

这样就完成了移动,如果明白了这个,那么前面的就好懂了,

hanio(n-1,a,c,b); //因为hanio函数实际移动的是char a,char c,也就是第二和第四个参数,所以这儿可以看成把n-1个盘子从a移动到b;

move(a,c);

hanio(n-1,b,a,c); //这儿可以看成把n-1个盘子从a移动到b;

关于C语言汉诺塔问题

Try this:#include void Move(int n,char x,char y) { printf("move number-%d from %c to %c\n",n,x,y); } void Hannoi(int n,char a,char b,char c) { if(n==1) Move(1,a,c); else { Hannoi(n-1,a,c,b); Move(n,a,c); Hannoi(n-1,b,a,c); } } int main() { int level=7; printf("Hanoi:%d\n",level); Hannoi(level,'a','b','c'); printf("Solved\n"); return 0; } save as "hanoi.c" and compile it with "cl.exe hanoi"

利用递归求解。把所有的盘子假想成两份,一份有n-1个,一份有1个,那么解决方案就是把n-1份从a搬到b,然后把1个从a搬到b,最后再把n-1份从b搬到c。

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上,最后将2个盘子从B移到C上,就完成了最终的任务。但是,move(2,a,b)和move(2,b,c)这个操作要继续分解。 2.move(2,a,b) <==> move(1,a,c);move(1,a,b);move(1,c,b) 3.move(2,b,c) <==> move(1,b,a,);move(1,b,c);move(1,a,c); 4.最后,合成所有的动作就是:move(1,a,c);move(1,a,b);move(1,c,b);(前三步在完成move(2,a,b)的动作)move(1,a,c);move(1,b,a,);move(1,b,c);move(1,a,c);(后三步在完成move(2,b,c) 的动作) 现在,你拿三本书来验证一下上面的对不对,再体会一下。思考方式就是递归的方式。 一个元操作move(n,x,y,z)是指,把n本书从柱子x移到柱子z,移的过程中要借用柱子y。

我的move里面省略了y,是为了表达更清晰。当n>1时,意味着我们要先把上面的n-1个移走(这一操作要继续分解为更小的操作),再最下面的那个最大的移到目标位置,最后再把上面的n-1也移到目标位置(这一操作也要继续分解为更小的操作)。当n=1时,意味着我们可以直接把这1个盘子移到目标位置,此时也就退出了递归。 这里有个细节要体会一下,为什么要先移上面的n-1个,再最后移下面一个大的,因为汉诺塔问题规定,任何时候都必须是大的在下面,小的在上面,对于上面的n-1个,最下在的大盘子就像平地一样,其所在的柱子可以随意使用。反过来,先移上面1个,再移下面的n-1个就是不可行的,因为会有一个柱子变得不可用。 你跟踪下程序,会让你更清晰,注意参数的变化。

也可以拿纸画一下。 注意,我们实际演示中的一个移动的动作,程序中就是用printf()这样一句话来表示的。OKAY?

以下为关联文档:

迷宫问题 C语言#include<stdio.h>int main(void){ int maze[100][100]; int MAZE[100][100]; int m,n; int p,q; printf("输入迷宫的行数m,列数n:\n"); scanf("%d%d",&m,&n); for(p=0;p<=n+1;p++)...

c语言问题while执行语句问题执行了n次,为什么呢?? 从基础慢慢分析吧 while(布尔值)语句 这个你应该知道的吧 意思就是如果while里的 “布尔值” 是 “真” 的时候, “语句” 就会执行 如果是 “假” while 就...

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语言菜鸟问题,VC中调用fortran有哪些方法:实际上这个问题很多情况下是由于路径设置的问题引起的, “CL.exe”是VC使用真正的编译器(编译程序),其路径在“VC根目录\VC98\Bin”下面...

推荐阅读
图文推荐