对于以下一个递归函数,可用一个栈实现:
1.递归,直接递归即可
#include<bits/stdc++.h>
using namespace std;
int n=4,x=1;
int p(int cur) //按照函数的描述进行递归即可
{
if(cur==0) return 1;
if(cur==1) return 2*x;
return 2*x*p(cur-1)-2*(cur-1)*p(cur-2);
}
int main()
{
printf("%d\n",p(n));
return 0;
}
2.滚动数组非递归解法
因为每次计算只会涉及3个状态fn,fn+1,fn+2,所以定义一个长度为3的数组f[3],每次计算之后把当前的数值赋给前一个数组元素即可;
#include<bits/stdc++.h>
using namespace std;
int n=4,x=1;
int f[3];
int main()
{
f[0]=1,f[1]=2*x,f[2]=2*x*f[1]-2*(2-1)*f[0];
int co=3;
while(co<=n)
{
f[0]=f[1];
f[1]=f[2];
f[2]=2*x*f[1]-2*(co-1)*f[0];
co++;
}
printf("%d\n",f[2]);
return 0;
}
3.栈的非递归解法
定义一个结构体,其中包含下标num和值val,定义一个该结构体类型的栈,首先将第一项和第二项k1,k2计算出来,之后把第n项到第3项依次入栈。然后计算栈顶第3项的值,直到最终计算出第n项的值。
#include <bits/stdc++.h>
const int N = 100;
struct node{
int num;
int val;
};
int n=4,x=1;
int main(){
node stk[N];
int k1=1,k2=2*x,tt=-1;
for(int i=n;i>=2;i--) //第n项在栈底,第3项在栈顶
{
stk[++tt].num=i;
}
while(tt>=0) //取出栈顶元素计算每一项的具体值
{
stk[tt].val=2*x*k2 - 2*(stk[tt].num-1)*k1;
k1=k2; //更新k1,k2的值,方便进行下一步计算
k2=stk[tt].val;
tt--;
}
printf("%d\n", k2); //最终k2的值就是我们要求的答案
return 0;
}