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

C语言函数递归调用汉诺塔问题

02月20日 编辑 39baobao.com

[C语言函数递归调用问题]算法思路,比如说10个圆盘,需要从a处移到c处,就是先把上面的9个盘移到b处,(怎么移呢,再调用函数move)再把第十个盘移到c处,再把b里面的9个移到c处,(怎么移呢,再调用函数move)。 经典的函...+阅读

我一步步的给你讲,就会懂啦:

首先hanoi函数如果把当中的move函数给去掉,就变成了:

1

2

3

4

5

6

7

8

9

10

11

voidhanoi(intn, charone , chartwo, 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语言一道上机题关于函数的递归调用if (n > 1) return (n*fun(n-1)); return 1; 如果 n>1 执行 return (n*fun(n-1)); 否则执行 return 1; 因为 main 函数里调用的是 fun(10); 所以对于 fun 函数,入口参数 n 等于10;...

C语言函数递归调用错误你这毛病太多!! 首先没看明白你的主函数怎样调用的change函数。 再者函数参数不够详细啊!!光有一个参数是不够的,还得有个数组下标作参数,好能表示你的字符要存到数组的哪个元素里...

C语言里函数递归调用该怎样理解?那你这样想吧。数学中不是有递推公式吗。比如:A1=1, An=An-1 +2。那么你用递归就是要想求An,只要An-1求出来,只要加2就是An啦。以此类推,只要知道A1就行啦。 int labi(int n) {...

c语言里面的函数递归调用看不懂了调用fun(3),fun(3)中调用fun(2),fun(2)中调用fun(1),fun(1)中调用fun(0),此时n=0,,条件不成立,这时开始以一层一层返回,返回到fun(1),fun(1)中第一条调用完了(刚返回的),--n此时n=...

c语言用递归调用求函数#include<stdio.h> double add (double x,double n)//int 改为double {int N=1,p=-1,q=1,i,j,k; double m=1.0; for(k=1;k<=(2*n-1);k++) N=N*k; for(i=1;i<(2*n-1);i++) //...

C语言函数返回值递归调用int fun(int n) 定义函数fun {if (n>1) return n*fun(n-1); 如果n>1,函数返回值为n*fun(n-1) else return 1; } 否则为1; main() 主函数 {int i,s=0; 整型i,s,其中s=0 for(i=1;i<=...

c语言函数的递归调用递归必须满足两个条件:1.初始条件;2.递归函数.举个例子,求阶乘:有f (1)=1;f(n)=n*f(n-1)(n≥2)现在你可以实现如下:long func(int n)//定义函数 { long f,s=0; if(n==1)f=1; else...

c语言递归调用问题嗯,你可能理解错了,不是最终最终执行08条,而是在任何一次的递归调用结束之后都有可能从这个地方返回。我来讲解一下吧,如果这棵树非空,而且存在左子树,那么的确会在第5行一直走到...

c语言函数递归调用是怎么回事一般来说是自己调用自己,一般有两个分支,一个分支是调用自己,还有一个分支是结束条件 如求n! int f(int n) { if(n==1) //这个是结束条件 return 1; else //这个是调用自己的分...

推荐阅读
图文推荐