首页 新闻 会员 周边 捐助

函数递归一次要用多大的栈空间?

0
[已解决问题] 解决于 2016-03-04 17:22

如题:

 此函数 递归一次 要占用多大栈空间? 
 
VS2010下, 传参5000,就挂了!!!
 
leungcnblogs的主页 leungcnblogs | 初学一级 | 园豆:162
提问于:2016-03-03 17:06
< >
分享
最佳答案
1

改成尾递归

int add(int sum,int n)
{
    if(n<0)
        return sum;
    sum=sum+n;
    return add(sum,n-1);
}

奖励园豆:5
Daniel Cai | 专家六级 |园豆:10424 | 2016-03-04 09:52

原来就是递归啊.

递归深度太大引起栈溢出! 我是想问下递归占用的空间.  嘿嘿...

leungcnblogs | 园豆:162 (初学一级) | 2016-03-04 12:24

@leungcnblogs: 占用的空间根据你的代码所决定的,这个不好说的,尾递归栈空间可以重用的。

Daniel Cai | 园豆:10424 (专家六级) | 2016-03-04 12:26

@Daniel Cai: 

放到后面, 按上面你说的, 也是不行. 

DefaultPrj.exe 中的 0x00f215ec 处有未经处理的异常: 0xC00000FD: Stack overflow

leungcnblogs | 园豆:162 (初学一级) | 2016-03-04 13:55

@leungcnblogs: 你是什么语言?按道理而言大部分语言在处理尾递归时会直接jump到递归开始的栈处重复执行的。

再不行你展开为迭代即可。

Daniel Cai | 园豆:10424 (专家六级) | 2016-03-04 14:08

@Daniel Cai:

C++,

用迭代可以的

leungcnblogs | 园豆:162 (初学一级) | 2016-03-04 14:41

@leungcnblogs: 一般能用迭代就用迭代吧,一则运行范围可知,再则效率在某些编译器下会高些,而且有部分侏罗纪时代的语言根本不支持递归。

Daniel Cai | 园豆:10424 (专家六级) | 2016-03-04 17:17
其他回答(2)
2

无法准确的计算出来,与编译器和机器都有关系。其大致的计算方法如下:

每一次调用都会在栈中至少生成一个int的临时变量,同时进行下一次调用时会将当前的CPU寄存器的值压入栈中。

于是就分为两部分一是临时变量占用的空间、一是寄存器保存时占用的空间。

十月1993 | 园豆:214 (菜鸟二级) | 2016-03-03 17:29

查了一下, VS栈空间是2M, 

这个递归树 怎么算 也算不出来这么大.

你的意思我明白了. 谢谢!

支持(0) 反对(0) leungcnblogs | 园豆:162 (初学一级) | 2016-03-04 11:38
1

Windbg?

jello chen | 园豆:7336 (大侠五级) | 2016-03-04 13:05

还真的? 擦, 也是醉了....

支持(0) 反对(0) leungcnblogs | 园豆:162 (初学一级) | 2016-03-04 13:54

linux 上确实可以.

支持(0) 反对(0) leungcnblogs | 园豆:162 (初学一级) | 2016-03-04 13:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册