在浙江大学陈越的《数据结构》的课中,有这样一道题:
写程序计算给定多项式在定点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了。
也可以算出正确结果了。
这就是我对于秦九韶算法的初步理解。
如果有误,希望各位大佬能够指出。