////////////////////////////////////////////////////////////////////////////////
/*勒让得多项式: */
/* */
/* 1 n=0; */
/* Pn(x) = { x n=1; */
/* ((2n-1)xPn-1(x)-(n-1)Pn-2(x))/n n>1; */
/* */
/* 其中x为未知量,n为项数!! */
/* 函数原形:float Prrande(float x,unsigned n); */
/* 时间:2007\03\16 by:jun */
/*code: */
////////////////////////////////////////////////////////////////////////////////
#include <stdio.h>
#include <stdlib.h>
float Prrande(float x,unsigned n)
{/*递归实现,由多项式定义可写:*/
if(n==0)
return 1;
else
if(n==1)
return x;
else
if( n>1 )
return (float)((2*n-1)*x*Prrande(x,n-1)-(n-1)*Prrande(x,n-2))/n;//very long!
}
float _Prrande(float x,unsigned n)
{/*非递归实现:先计算前n-1,n-2项的值,再计算第n项的值*/
float sum,t,_t;
unsigned i;
t = 1;
sum = x; //初始化
for(i=2;i<=n;i++)
{
_t = sum; //保存前n-1项值。
sum = ((2*i-1)*x*_t-(i-1)*t)/i;
t = _t; //前n-1项变为下一运算的前n-2项!
}
if(n==0)
return t;
else
return sum;
}
int main(int argc,char *argv[])
{
float x,sum1,sum2;
unsigned n;
scanf("%f%u",&x,&n);
sum1 = Prrande(x,n);
sum2 = _Prrande(x,n);
printf("sum1 = %g\tsum2 = %g\n",sum1,sum2);
system("pause");
return 0;
}

评论