使用一个栈实现以下递归函数的非递归计算:
设计一个栈用于保存n和对应的Pn(x)
double p(int n,double x){
struct stack{
int no;
double val;
}st[MaxSize];
int top=-1;
double fv1=1,fv2=2*x;
for(i=n;i>=2;i--){
top++;
st[top].no=i;
}
while(top>=0){
st[top].val=2*x*fv2-2*(st[top].no-1)*fv1;
fv1=fv2;
fv2=st[top].val;
top--;
}
if(n==0){
return fv1;
}
return fv2;
}
```c
double p(int n,double x){
```
定义一个函数 `p`,它接受一个整数 `n` 和一个浮点数 `x` 作为参数,返回一个浮点数。`n` 通常代表多项式的阶数,`x` 是多项式的变量。
```c
struct stack{
int no;
double val;
}st[MaxSize];
```
定义了一个结构体 `stack`,其中包含两个字段:`no` 存储整数,`val` 存储浮点数。这个结构体数组 `st` 被用作栈(具有 `MaxSize` 的最大大小),用来保存中间计算结果。
```c
int top=-1;
```
初始化栈顶指针 `top` 为 `-1`,表示栈为空。
```c
double fv1=1,fv2=2*x;
```
初始化两个浮点变量 `fv1` 和 `fv2`。这两个变量在递归计算中起到了基本案例的角色。对于Legendre多项式,这里的`fv1` 对应 `P0(x)`(总是 1),`fv2` 对应 `P1(x) = 2x`。
```c
for(i=n;i>=2;i--){
```
从 `n` 开始,将所有的多项式顺序加入到栈中,直到 2。这是因为我们已经初始化了前两个多项式,我们需要计算从 `P2(x)` 到 `Pn(x)` 的值。
```c
top++;
st[top].no=i;
}
```
增加栈顶指针 `top` 并将当前的多项式阶数 `i` 存入栈中。
```c
while(top>=0){
```
当栈不为空时,进行循环。这个循环是用来计算并更新多项式的值。
```c
st[top].val=2*x*fv2-2*(st[top].no-1)*fv1;
```
这行是多项式递推公式的实现:`Pn(x) = (2x * P(n-1)(x) - 2(n-1) * P(n-2)(x))`。这里,`fv2` 是 `P(n-1)(x)`,`fv1` 是 `P(n-2)(x)`。计算结果存储在当前栈顶元素的 `val` 字段。
```c
fv1=fv2;
fv2=st[top].val;
top--;
}
```
更新 `fv1` 和 `fv2` 为最新的两个多项式值,以便用于下一次迭代。然后减小栈顶指针 `top`,即从栈中移除当前顶部元素。
```c
if(n==0){
return fv1;
}
return fv2;
}
```
最后,根据传入的 `n`,返回相应的多项式值。如果 `n` 为 0,返回 `fv1`(即 `P0(x)`)。否则返回 `fv2`,即最后计算的多项式值 `Pn(x)`。