关于递归与栈的联系便不再赘述,这里主要使用的是链式栈,
通过自定义栈去模拟递归算法的递归过程,该过程是非递归的,故称非递归算法
阶乘运算的递归算法
int Factorial_1(int n) {
if (n == 1) return 1;
return Factorial_1(n - 1) * n;
}
链式栈的定义
// 普通的链式栈不需要特殊地定义数据集合,这里是为了便于记录递归过程中的各种状态参数
// 若函数传入的参数有多个,则定义多个参数 int par1, par2, par3 ...
typedef struct Data { // 数据集合
int par; // 函数所传入的参数
int res; // 函数所返回的结果
}Data;
typedef struct StackNode { // 链式栈结点结构体
Data data;
struct StackNode *next;
}StackNode, *
链式栈的基本方法( 因为这里的链式栈是全局声明的,故其基本方法省略了栈头参数的传入 )
// 初始化方法
Status InitStack() {
S = NULL;
cout << "链式栈初始化完成" << endl;
return OK;
}
// 压栈方法
Status Push(Data e) {
LinkStack newNode = new StackNode;
newNode->data = e;
// 头插法
if (S == NULL) {
S = newNode;
S->next = NULL;
}
else {
newNode->next = S;
S = newNode;
}
return OK;
}
// 弹栈方法
Status Pop(Data &e) {
if (IsEmpty()) { //
cout << "栈已空,弹栈失败" << endl;
return ERROR;
}
LinkStack tmp = S->next;
e = S->data;
delete S;
S = tmp;
return OK;
}
// 获取栈顶数据集合方法
Data GetTop() {
return S->data;
}
// 检查空栈方法
bool IsEmpty() {
if (S == NULL) return true;
return false;
}
链式栈模拟的阶乘运算递归过程的非递归算法
int Factorial_2(int n) {
int tmp_par; // 临时参数
int tmp_res; // 临时结果
Data curData; // 当前栈位的数据集合
bool Outage = false; // 递归出口状态字
Push({n, 0}); // 开始对第一个数据集合进行压栈
while (true) {
if (Outage) { // 确认已经找到递归出口的情况,开始逐层向上返回结果
Pop(curData); // 获取栈顶的数据集合,同时进行弹栈
if (IsEmpty()) return curData.res; // 如果弹栈后栈已为空,则直接返回弹栈的数据集合结果即可
// 开始更新栈顶的数据集合
tmp_par = GetTop().par;
tmp_res = curData.res * tmp_par; // 通过之前获取的栈顶数据,根据递归规则计算当前栈顶的结果
Pop(curData); // 将旧的数据集合弹栈
Push({tmp_par, tmp_res}); // 压入新的数据集合
}
else {
if (GetTop().par == 1) { // 递归出口
Outage = true; // 标志已经找到递归出口
Pop(curData); // 将旧的数据集合弹出
Push({curData.par, 1}); // 压入新的数据集合( 新的数据集合即更新了 res = 1 的数据集合,原参数保留 )
// 不能通过下面这种方式进行栈内数据的修改
// GetTop().res = 1;
}
else Push({(GetTop().par - 1), 0}); // 按递归规则将新的数据集合压栈( 主要针对传入参数的变化 )
}
}
}
测试
LinkStack S; // 全局的栈
int main() {
int n;
cout << "请输入 n :" << endl;
cin >> n;
cout << "普通递归方法:" << endl;
for (int i = 1; i < n; i++) {
cout << Factorial_1(i) << endl;
}
cout << "链式栈模拟的递归方法( 非递归实现 ):" << endl;
InitStack();
for (int i = 1; i < n; i++) {
cout << Factorial_2(i) << endl;
}
system("pause");
return 0;
}
结果