递归太深会导致栈溢出

  • Post author:
  • Post category:其他






如题。在写一个算法中,由于递归调用次数过多,堆栈溢出。




堆栈的大小是系统控制的,无法改变。




如果递归调用出现问题,可以考虑采取循环的方式来解决,将需要的数据在关键的调用点保存下来使用。简 单的说,就是用自己的数据保存方法来代替系统递归调用产生的堆栈数据。




你原先的递归算法设计的有问题。算法正确的情况下,使用过程中会出现堆栈溢出的话,可以通过修改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