秦九韶算法的理解

在浙江大学陈越的《数据结构》的课中,有这样一道题:

写程序计算给定多项式在定点x处的值:

                                        f(x)=a0+a1*x+a2*x^2+....an*x^n

对于第一种方法,很容易理解。 

double f(int n,double a[],double x)

{

        int i;

        double p=a[0];

        for(i=0;i<=n;i++)

                p+=(a[i]*pow(x,i));

        return 0;

 但是第二种方法(用秦九韶算法),光看是很难理解原理究竟是什么。

double f(int n,double a[],double x)

{

        int i;

        double p=a[n];

        for(i=0;i>0;i--)

                p=a[i-1]+x*p;

        return 0;

}

下面我用一道题来解释我理解的秦九韶算法的原理:

写程序计算给定多项式f(x)=4*x^3+3*x^2+2*x+1在点x=2处的解。

代码如下:

#include<stdio.h>
int main()
{
    int a[4]={1,2,3,4};
    int x=2;
    int i;
    int res=a[3];
    for(i=3;i>0;i--){
        res=a[i-1]+x*res;
    }
    printf("%d",res);
    return 0; 
 }  

1.将f(x)=4*x^3+3*x^2+2*x+1表达成f(x)=1+x*(2+x(3+x*4))的格式

2. 可以用笔和草稿纸推一遍:

(不看 int res=a[3]这行代码)

当i=3时,res=a[3]+x*res;

当i=2时(注意此时res=a[3]+x*res),res=a[2]+x*(a[3]+x*res);

当i=1时,res=a[1]+x*(a[2]+x*(a[3]+x*res));

当i=0时,res=a[0]+x*(a[1]+x*(a[2]+x*(a[3]+x*res)));

这时,你突然发现,最里面的res怎么还在呢?

所以res得提前设好,但又要符合我们公式的规律。

那就将res初始化为a[3],然后再用循环如上的代码。

现在我们再来推一遍过程:

当i=3时,res=a[2]+x*a[3];

当i=2时,res=a[1]+x* (a[2]+x*a[3]);

当i=1时,res=a[0]+x*(a[1]+x* (a[2]+x*a[3]));

啊哈,这下就没有res了。

也可以算出正确结果了。

这就是我对于秦九韶算法的初步理解。

如果有误,希望各位大佬能够指出。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值