用链式栈实现阶乘运算递归过程的非递归算法

关于递归与栈的联系便不再赘述,这里主要使用的是链式栈,

通过自定义栈去模拟递归算法的递归过程,该过程是非递归的,故称非递归算法

阶乘运算的递归算法

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;
}

结果

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值