c语言函数汉诺塔 c语言解决汉诺塔程序代码

C语言函数递归调用汉诺塔问题我一步步的给你讲,就会懂啦:
首先hanoi函数如果把当中的move函数给去掉,就变成了:
void hanoi(int n, char one , char two, charthree)
{
if(n == 1)
printf("%c-%c\n", one, three);
else
{
hanoi(n - 1, one, three, two);
printf("%c-%c\n", one, three);
hanoi(n - 1, two, one, three);
}
}
也就是把move(one,three),变成了printf("%c-%c\n", one, three); 。少了一个函数,更加清晰
所以这里的hanoi函数就有了执行的内容:printf
下面以3个盘子为例进行模拟计算机的执行过程:
1、hanoi(3,A,B,C),开始了这步 , 进入第一层函数,计算机在函数中会进行自我的再次调用(第7行代码)
2、(第7行):hanoi(2,A,C,B),于是这又是一个新的hanoi函数,这里我把它成为第二层函数
同样执行到第7行,卡住了,再次一次自我的调用
3、(进入第三层函数):hanoi(1,A,B,C) , 这里的第三层n=1,所以在第四行就显示出了"A-C" , 至此,第三层函数结束,回到调用他的第二层函数
4、在第二层当中,继续第8行的内容,所以显示出"A-B",继续运行 , 到第9行 , 开始了有一次自我调用
5、把她称为贰号第三层函数吧 。。。hanoi(1,B,A,C),和第3步类似 , 这一层函数显示出了"B-C" , 然后结束函数,返回调用它的第二层函数
6、第二层函数执行完毕,返回调用它的第一层函数
7、第一层函数中执行到第8行,显示出"A-C",然后执行第9行:hanoi(2,B,A,C)
............
如果看到了这里理清楚了关系就会懂啦,接下来还有一半,如果都写下来就太复杂了- 。-
你所说的空函数是指没有返回值,但是这里利用的是电脑调用函数的那种关系来解决的问题,比如上面的3步,会自动返回到第二层函数并继续
还可以这样理解汉诺塔,汉诺塔其实是将复杂的问题简单化,
先不管他有多少个盘子从A到C,我只把它视作3步
就像上面那样找个例子,反复的按照代码模拟计算机运行,过个五次六次 , 就会懂啦
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;
【c语言函数汉诺塔 c语言解决汉诺塔程序代码】}
//以下是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语言汉诺塔我先回答最后一个问题,move只有输出是因为,我们本来就不需要真的挪动它,也没办法真的挪动它,只要打印挪动方法就可以了
n=3的情况中
我们要做的是把三个盘子挪到第三个柱子
hanoi函数的功能是 , 把最小的n个盘子从one柱挪到three柱
步骤1 首先把前n-1个盘子从one柱挪到two柱 , 这样就可以最大盘上面就什么都没有了
步骤2 直接把最大的盘子挪到three了
步骤3 然后再把那n-1个从two柱挪到one柱
为了实现步骤1 , 也是一样的方法
我们把前两个盘子挪到two,需要下面三个步骤
步骤1 首先把前n-2个盘子从one柱挪到three柱,这样就可以最大盘上面就什么都没有了
步骤2 直接把最大的盘子挪到two了
步骤3 然后再把那n-2个从three柱挪到two柱
原先的步骤3也是一样的道理
理解递归,并不需要完全搞清楚执行顺序,只需要把递归调用的关系找到就行了
另外,你可以在hanoi开始就把n,one,two,three打印出来,可以很清晰的看到执行过程
C语言汉诺塔要看懂递归程序,往往应先从最简单情况看起 。
先看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语言汉诺塔怎么理解拜托各位大神首先你得明白这是用函数递归调用的方法,递归就不用c语言函数汉诺塔我说c语言函数汉诺塔了,看代码
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语言函数汉诺塔和c语言解决汉诺塔程序代码的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读