如题:
改成尾递归
int add(int sum,int n)
{
if(n<0)
return sum;
sum=sum+n;
return add(sum,n-1);
}
原来就是递归啊.
递归深度太大引起栈溢出! 我是想问下递归占用的空间. 嘿嘿...
@leungcnblogs: 占用的空间根据你的代码所决定的,这个不好说的,尾递归栈空间可以重用的。
@Daniel Cai:
放到后面, 按上面你说的, 也是不行.
DefaultPrj.exe 中的 0x00f215ec 处有未经处理的异常: 0xC00000FD: Stack overflow
@leungcnblogs: 你是什么语言?按道理而言大部分语言在处理尾递归时会直接jump到递归开始的栈处重复执行的。
再不行你展开为迭代即可。
@Daniel Cai:
C++,
用迭代可以的
@leungcnblogs: 一般能用迭代就用迭代吧,一则运行范围可知,再则效率在某些编译器下会高些,而且有部分侏罗纪时代的语言根本不支持递归。
无法准确的计算出来,与编译器和机器都有关系。其大致的计算方法如下:
每一次调用都会在栈中至少生成一个int的临时变量,同时进行下一次调用时会将当前的CPU寄存器的值压入栈中。
于是就分为两部分一是临时变量占用的空间、一是寄存器保存时占用的空间。
查了一下, VS栈空间是2M,
这个递归树 怎么算 也算不出来这么大.
你的意思我明白了. 谢谢!
Windbg?
还真的? 擦, 也是醉了....
linux 上确实可以.