[数据结构习题]用栈实现递归函数的非递归运算

 题目来源:王道23数据结构,3.3.6,综合应用题03

非王道书教材内答案解法!

 整体思路:

    从前往后计算解题,我们可以创建一个两个元素的栈,用于保存Pn-1(x)与Pn-2(x),初始化为栈底元素P0(x),栈顶元素P1(x)。根据这两个可以往后得出P3(x),P4(x)。。。每次计算时依次弹出站内元素,并用变量记录下来,计算完后便可抛弃Pn-2(x),将Pn-1(x)压入栈底,再将Pn(x)压入栈顶。整体思路就是将从后往前(n-0)的递归解题变为从前往后(0-n)的循环解题。代码如下

#include<iostream>
using namespace std;

struct stack {
	int arr[2] = {0,0};
	int top=-1;
}; // 大小为2的辅助栈

bool push(struct stack &s ,int x) {
	s.arr[++s.top] = x;
	return true;
} // 入栈操作

bool pop(struct stack &s , int& x) {
	x = s.arr[s.top--];
	return true;
} // 出栈操作

int func_p(int x, int n) {

	if (n == 0)
		return 1;// n=1时直接返回1

	struct stack s;// 创建一个辅助栈
	int val1 = 0, val2 = 0, val3 = 0;
	push(s,1);
	push(s,2 * x); // 将1,2x依次压入栈

	// 当n>1的时候执行此循环
	for (int i = 2; i <= n; i++) {
		pop(s,val1); // 弹出Pn-1(x)
		pop(s,val2); // 弹出Pn-2(x)
		push(s,val1); // 再将原Pn-1(x)压入栈中,为下一次循环做准备
		val3 = 2 * x * val1 - 2 * (i - 1) * val2; // 求出Pn(x)
		push(s,val3); // 将目前Pn(x)压入栈中
	} 
	int res=0;
	pop(s,res); // 此时栈顶元素即为Pn(x)
	return res;
}

执行检验结果:

int main() {
	cout << "请输入x与n" << endl;
	int x, n;
	cin >> x >> n;
	cout << func_p(x, n) << endl;// x,n

	system("pause");
	return 0;
}

我们测试输入x=2,n=3,稿纸手算结果如下

 代码运行结果为

结果正确! 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Grey.yschakk

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值