新浪博客

递归调用出现堆栈溢出的解决方案

2017-05-10 16:29阅读:
在实际开发的时候,经常会用到递归函数。其优点在于定义简单,逻辑清晰。但使用递归函数需要注意防止栈溢出。在计算机中,函数调用时通过栈(Stack)来实现的,每当调用一个函数,栈就会加一层栈帧,函数返回就减一层栈帧。而栈资源有限,当递归深度达到一定程度后,就会出现意想不到的结果,比如堆栈溢出。 通过查阅资料,总结出一个目前来说较为有效的解决方案:利用循环函数或者栈加while循环来代替递归函数。在这里呢,我主要想分享的是栈加while循环这种解决方法。
栈加while循环,个人认为其原理大概是在堆中开辟区域来模拟栈的行为,这样就能控制内存分配和流处理,从而避免栈溢出。(如何不当之处,还请见谅与指正)
用栈加while循环代替递归的几个步骤
一、定义一个新的结构体StructA,用于保存递归结构中的一些数据和状态信息。
在StructA内部需要包含的变量有以下几种:
  1) 一般当递归函数调用自身时,函数参数会发生变化。所以你需要包含变化的参数,引用除外;
  2) 阶段性变量'Stage'(通常是一个用来转换到另一个处理分支的整形变量);
  3) 函数调用返回以后还需要继续使用的局部变量。
br> struct StructA{
int ParamA,ParamB; //变化的递归函数的参数
int ReturnLocal; //函数调用返回后还需继续使用的局部变量
int Stage;
};
二、创建函数。

递归调用出现堆栈溢出的解决方案
简单示例:
递归调用出现堆栈溢出的解决方案

我的更多文章

下载客户端阅读体验更佳

APP专享