首先参考 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;
}