递归太深会导致栈溢出


如题。在写一个算法中,由于递归调用次数过多,堆栈溢出。
堆栈的大小是系统控制的,无法改变。
如果递归调用出现问题,可以考虑采取循环的方式来解决,将需要的数据在关键的调用点保存下来使用。简 单的说,就是用自己的数据保存方法来代替系统递归调用产生的堆栈数据。
你原先的递归算法设计的有问题。算法正确的情况下,使用过程中会出现堆栈溢出的话,可以通过修改PLUS函数,利用循环来减少递归的层数。
1)project property->Configuration Properties->Linker->System->Stack Reserve Size
改成10000000,就可以了,注意是7个0哦

2)将数组改成指针,然后用new或malloc在heap中动态分配。

我在vs2008下创建了WindowsMoble项目
在属性->连接器->系统下有一项“堆栈保留大大小”
默认是 65536
然后我调用jrtplib库中的session,create后报错,我怀疑是多线程问题
然后我把65536修改为 0,问题就解决了

http://blog.sina.com.cn/s/blog_48526a5f0100jaxv.html


遍历的话不要用递归(深度优先遍历)

要用广度优先遍历

##############################################################################################################

溢出的意思就是越界,操作系统会给每个进程分配一个最大上限的堆栈空间,如果超过了这个内存空间大小程序就会coredump,就像你使用int *pi = new int[100000000];会崩溃一样,因为这里堆溢出了。
操作系统分配给一个进程的栈空间是2M,堆空间在32位机器上是4G。如果你的进程的栈空间使用超过了2M就会栈溢出,堆使用超过4G就会堆溢出。
那么递归为什么会导致栈溢出呢?相信楼主知道栈的出入规则,先入后出,递归的话那么先入的一致不能出栈,会一致存在栈空间中,这样就容易导致栈满而溢出。
哈哈,还有不懂不?
每当你调用一个函数,在这个函数执行前都会将之前的代码地址(也就是调用点)入栈,等被调用的函数执行完将地址出栈,程序根据这个数据返回调用点。
若递归调用次数太多,就会只入栈不出栈,于是堆栈就被压爆了,此为栈溢出。

递归的层度太多了却还没有到达结束条件,以至于超出了系统所能承受的程度


递归函数调用的太深,需要太多的内存,递归里用到的局部变量存储在堆栈中,堆栈的访问效率高,速度快,但空间有限,递归太多变量需要一直入栈而不出栈,导致需要的内存空间大于堆栈的空间,栈空间是2M,堆空间内存空间。将逻辑关系理清楚,减少递归的次数应该能解决问题,像你这样递归深度比较大,不太适合用递归来解决问题,楼主可以考虑下其他的解决方案,即便是现在没问题,等到以后还是可能会出现问题的,防止隐患,楼主可以考虑放弃递归。


http://zhidao.baidu.com/link?url=ACLesJE7OPoGUqpCJgdsqUKSg2xM9N1NSoPXT7a_U8SK1ZgN5rCOZSpP3FHwcernvdgXqLMmFa9ZiQvFqtdcp_


VC++中修改默认栈大小的方法

http://blog.sina.com.cn/s/blog_58c3f79601017moo.html

如何利用循环代替递归以防止栈溢出(译)

自己:文章最后有提到两者的性能比较,但没有详细分析,也没得到什么结论。

尾递归

http://www.cnblogs.com/JeffreyZhao/archive/2009/03/26/tail-recursion-and-continuation.html

http://www.cnblogs.com/JeffreyZhao/archive/2009/04/01/tail-recursion-explanation.html


  • 12
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值