代码改变世界

horner's rule霍纳法则及综合除法

2012-03-15 23:15  youxin  阅读(1240)  评论(0编辑  收藏  举报

首先参考 horner's rule: http://en.wikipedia.org/wiki/Horner_scheme

在synthetic divisions : http://en.wikipedia.org/wiki/Ruffini%27s_rule

 pn(x)=anx^n+a(n-1)*X^(n-1)+.....+a1*x+a0;

归纳:

1基础部:n=0; 有p0=an;

2,归纳不:对任意的k,1<=k<=n;如果前面k-1步已经计算出p(k-1);

p(k-1)=anX(k-1)+a(n-1)X(k-2)+........a(n-k+2)X+a(n-k+1);

则有pk=Xp(k-1)+a(n-k);

如果用一个数组来存放多项式,把an存放于a[0],a(n-1)存放余a[1];那么多项式求值递归算法如下:

float horner_pol(float x,float a[],int n)
{
float p;
 if(n==0)
   p=a[0];
 else
   p=horner_pol(x,a,n-1)*x+a[n];
   return p;
 }
   

注意a[0]存放的是最大的an,a[n]存放的最好的a0。为什么?

 

 用迭代来做:(a[]中0存放a0,1存放a[1],

#include<iostream>
using namespace std;

float horner(int a[],float x,int n)
{
    float result=0;
    for(int i=n;i>=0;i--)
     
    {
        result=result*x+a[i];
    }
    return result;
}
int main()
{
    //结果19
    int a[]={1,1,2,1};
    int x=2;
    int n=3;
    cout<<horner(a,x,n)<<endl;
}

 

 

f(x)=x/2+x^2/4+...+x^n/2^n的和。

分析,提取一个x/2来,就有了一个递归式

f(x)=x/2 *(f(x-1)+1);

代码如下:

#include<stdio.h>

int func(int x,int n)
{
if(n==1)
return x/2;
else
return (func(x,n-1)+1)*x/2;
}
int main()
{
int x,n,result;
printf("请输入两个整数x和n\n");
while(scanf("%d%d",&x,&n)!=0)
{
result=func(x,n);
printf("结果为%d",result);
printf("\n请继续输入两个整数x和n\n");


}
return 0;
}