c语言里递归函数里定义的变量是否会随着调用自身而从新定义?

小弟刚学C语言,学到函数的递归问题,查了很多资料都找不到一个准确的答案,请问各位大大,如果函数递归调用,函数里定义的变量是否会随着调用自身而从新定义一次?这样是否会同时在内存中分配空间?如果是的话是否会让程序变得缓慢?

是的,局部变量会新定义一次,不过仅局限于局部变量(全局变量和静态变量都是全局的,要是还没学暂时不用管)。
并不能说是“同时”,应该说是“同样”,时间上肯定是按照调用的先后顺序的。
递归确实会让程序变慢,但只是相对于不需要递归的等价代码。而且原因也不是内存分配导致的,而是因为函数调用产生的。追问

谢谢你,那我是否可以认为,每调用一次就定义一次,并分配了一块空间,而定义的变量和上一次定义的变量所在的空间是不同的呢?也就是说在函数递归期间,会产生无数个定义的变量而他们在函数没返回的时候,一直存在于内存中呢?

追答

是不同的。肯定不会相同啊,局部变量相同就乱套了。
这个“无数个”的说法是不对的,递归函数的两个要素就是递归停止条件和递归规则,必须有一个递归停止条件,不然会栈溢出的,所以递归不是“无数的”。栈就是保存局部变量的内存区,这个内存区专门为函数调用以及局部变量使用,这个是有个大小的。
“在函数没返回的时候,一直存在于内存中呢?”是的,函数的当前一次运行,之前调用它的所有都在内存中呢。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-12-25
相反,会提高程序的运行效率,因为函数调用自身,所以是在同一块内存中调用运算的,会提高运行效率,并不会同时分配多个空间,因为当函数递归调用自身的时候,上一次的函数体已经执行完毕。有点类似循环,但是又不是循环。追问

那要是在函数开始的时候定义的变量,在下一行的时候就调用自身,那调用自身的时候不是要在定义一次变量之后才继续执行么?要是函数没返回之前,所在的变量岂不是会一直存在? 哎,有点晕晕的。

第2个回答  2013-12-25
每次递归的变量的作用域仅限当次递归所拥有,现在你是初学者不懂递归内在的原理是很正常的。当你学过数据结构的栈以后,你就会对递归有更深入一层的体会。追问

有点理解了,那我想问,每次调用后所定义的变量空间是否在函数没有彻底运行完之前都会一直存在?作用域的问题我理解了,就是每次调用后定义变量的空间时候也是存在的?

追答

是的,直至函数执行完毕后,栈清空了,变量也就不存在了。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网