c语言函数的递归调用题 c语言中函数的递归调用

C语言函数递归调用问题?

函数其实没有释放内存的概念,因为函数都是在指令区,而不是通常所说的释放内存对应的数据区,不过在整个程序执行完之后指令区也是要释放的。

公司主营业务:成都网站设计、成都网站制作、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联公司是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联公司推出昭通免费做网站回馈大家。

函数调用的大概过程如下:

1,将调用函数的上下文入栈;

2,调用被调用函数;

3,被调换函数执行;

4,调用函数上下文出栈,继续执行后继指令。

所以在函数调用过程中原调用函数是不会退出的-----即你所说的释放内存。

具体到你给的代码:

首先main中调用test,

进入test后要求读入一个char,

你输入'1'后执行case

'1'中语句,所以输出“已调用”,然后就执行test()语句,即递归调用,此时main调用的test要等新的test执行完毕才能继续执行后继的i++语句;

再次进入test之后与从main中进入时一样,如果输入的是'1'会接着递归调用test,由于你输入了5次1,所以会继续调用5次test;

在最后一个test中你输入了ESC?

所以不再走case

'1'而走default了,所以输出"222222";

switch执行完之后判断c==27满足,所以while循环退出,继续执行printf语句,由于之前的test统统没有执行过case

1里的i++语句,所以全局变量i还是0;输出i=0;

到此最后一次test执行完毕;

倒数第二次的test继续执行i++,

所以i=2了,case

1执行完毕,但由于没有写break语句,所以继续执行default

语句,输出"222222",

退出switch语句,判断c==27,

由于c是全局变量,且最后一次输入的刚好是ESC,

所以判断满足,

退出while循环,输出i=1,

到此倒数第二次test执行完毕;

与倒数第二次类似的继续执行倒数第三、倒数第四、倒数第五和最终的第一次test后继代码,也就输出如你列出的结果了。

C语言函数递归调用问题。

C语言函数调用整个过程是当准备调用函数时,先将形参以从右往左进行压栈程序跳转到函数入口,将函数的局部变量压栈(如果函数内部再调用函数就是在重复这个过程),函数返回时出栈,递归是在最后一个点上面函数返回,前面分配的资源根本没有释放,递归只有在最后一个返回点上面,根据递归顺序反过来释放资源,这也是为什么当递归的数据量比较大或者递归的层次比较深的时候,很容易造成内存溢出的原因

C语言函数递归调用问题

它主要有两个函数HANOI和MOVE,HANOI表示的是移动前N-1个盘子,MOVE表示移动第N个盘子,参数'A','B','C'表示的是柱子的名称,在程序中ONE,TWO,THREE这三个参数让人看了一头雾水,如果把变量名称改为SOURCE,TEMP,DESTINATION我想更好理解,这三个变量表示的是起始的柱子,过渡的柱子,和目标柱子,可能会问已经把三个柱子命名为A,B,C,为什么还要引入三个变量即:ONE,TWO,THREE(SOURCE,TEMP,DESTINATION).以移动3个盘子为例说明一下这个程序的思路:第一步把前两个从 ONE(SOURCE)借助TWO(TEMP)移动到THREE(DESTINATION)用HANOI函数中的第一个HANOI函数实现,第二步把 ONE余下的最大的盘子移动到THREE,用MOVE函数实现,第三步把TWO柱上的两个盘子借助THREE移回到ONE,用HANOI函数中的第二个 HANOI函数实现,(因为THREE柱上的盘子已经是最大的了,任何盘子都可以放到它的上面,所以可以想象为它不存在)可以想象第三步的时候TWO变成了起始柱,而ONE变成了目标柱,而THREE变成过度柱了,HANOI函数参数的变化正体现了这一点.当运行到这里时,第3个盘子已经从ONE移动到了 THREE(这只是分析,真实情况是只有当递归完成时才做到这一步).这个时候原先移动3个盘子的问题变成移动两个盘子的问题,所以再调用HANOI时盘子的数量为N-1.直到N==1时,调用结束.

递归还是不用好

C语言 函数的递归调用问题。 望解答!

if (ch == 'X') convert(ch+1);

如果这样那么输出就是只有W了,

main调用convert()传参'W', 'W'+1==‘X’所以if (ch 'X')成立,第一次递归调用convert(),传参'X'; if (ch 'X')不成立,第二次递归不执行;执行printf("%c", ch);输出'X';第一次递归执行完成,返回;然后main调用的执行printf("%c", ch);即'W';结果输出为XW

c语言关于函数的递归调用问题

一般来说是自己调用自己,一般有两个分支,一个分支是调用自己,还有一个分支是结束条件如求n! int f(int n) { if(n==1) //这个是结束条件 return 1; else //这个是调用自己的分支 return n*f(n-1); } 还有一个比较复杂一点,是双向调用,也就是a函数调用b函数,b函数在调用a函数这样循环调用,其实基于这个道理,还有多个函数互相调用,不过这样的情况很少见但万变不离其宗,每个函数都有两个分支,一个是结束条件,一个是调用函数

c语言函数递归调用

我给你举个简单的例子你就明白了,你可以假设n=3

然后代入这个函数,a(3)=a(2)+5;而a(2)=a(1)+5;a(1)=1

所以最后就是a(3)=1+5+5=11…

同理你可以算出a(10)=1+5*9=46

满意请采纳


本文名称:c语言函数的递归调用题 c语言中函数的递归调用
标题URL:http://myzitong.com/article/hepgej.html