递归调用出现堆栈溢出的解决方案
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;
};
二、创建函数。
简单示例: