数据结构-栈队列数组-应用题-3.3-3

使用一个栈实现以下递归函数的非递归计算:

设计一个栈用于保存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)`。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值