javascript每日一题,JavaScript简答题
C语言函数递归调用汉诺塔问题
我一步步的给你讲,就会懂啦:
创新互联建站是专业的朗县网站建设公司,朗县接单;提供成都网站设计、网站制作,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行朗县网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
首先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
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语言 汉诺塔 函数递归调用
首先我们要了解这个游戏,汉诺塔问题,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
先将A -- C,再将A -- B,因为汉诺塔是下面的圆盘(第二个)比上面的大(第一个),所以我们不能直接放在第三根柱子即A上,紧接着当我们想要移动第三个圆盘di时已经没有柱子了,所以我们先将C柱上的圆盘给B,再将A柱上的圆盘给C即A -- C,此时C上是第三大的圆盘,B上从上到下依此是第一个和第二个盘子,然后再将B -- A(最小号盘子给A),然后B -- C(第二大的盘子给C),再将最小盘子给C即A -- C,这是实现前三个盘子放置方法。
建议你找个小游戏玩一下,一边玩一边理解。
c语言递归调用汉诺塔
首先调用 hanoi(3,a,b,c)
判断 “3”是否为“1”
不为“1”
{
{ 调用 hanoi(n-1, one, three, two),即hanoi(2,a,c,b)
执行hanoi(2,a,c,b),此时 one = a,two = c,thtee = b;
判断 “2”是否为“1”,不为1
调用 hanoi(n-1, one, three, two),即hanoi(1,a,b,c)
执行hanoi(1,a,b,c),此时 one = a,two = b,thtee = c;
判断 “1”是否为“1”,为1,执行move(one, three)即move(a, c)
以上为循环执行hanoi(n-1, one, three, two)函数,直到“n==1”
}
执行move(one, three);
执行hanoi(n-1, two, one, three)
{
循环执行hanoi(n-1, two, one, three),直到“n==1”
}
}
主要是递归的用法
好像解释的不太清楚,但希望能帮到你。
分享题目:javascript每日一题,JavaScript简答题
网址分享:http://scyanting.com/article/phiejp.html