
/*
利用一个栈实现以下递归函数的非递归计算
分析:
这里我们需要使用栈的先进后出特性。我们可以看出,从n=2开始,每一个值便都与前两个值挂钩,且式子不变,我们
可以从栈顶到栈底依次边出栈边计算,直至栈底,便可以得出最终结果。
*/
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
struct Recursion {
int no;
int val;
};
struct Stack {
Recursion *arr;
int len;
int top;
};
int getP(Stack *s,int n,int x) {//该算法函数,传入栈,n和x
if (n==0) {
return 1;
}
int fv1 = 1, fv2 = 2 * x;
for (int i = n; i >= 2;i--) {//将序号入栈,从上至下,从2到n
s->top++;
s->arr[s->top].no = i;
}
while (s->top>=0) {//边出栈边计算
s->arr[s->top].val = 2 * x*fv2 - 2 * (s->arr[s->top].no - 1)*fv1;
fv1 = fv2;
fv2 = s->arr[s->top].val;
s->top--;
}
return fv2;
}
int main() {
Stack *s;
//声明各类方法
Stack *createStack(int);
bool push(Stack *,Recursion *);
bool full(Stack *);
bool empty(Stack *);
bool top(Stack *);
bool pop(Stack *);
int n, x;//题目所要用到的n和x
int p;//用于接收结果
printf("请输入n和x: \n");
printf("n=");
scanf("%d",&n);
printf("x=");
scanf("%d", &x);
//创建大小为n的栈
s = createStack(n);
p=getP(s,n,x);
printf("%d",p);
return 0;
}