递归的求法
#include<stdio.h>
#include<math.h>
double root(double,double);
int main()
{
double x1,x2,ans;
scanf("%lf%lf",&x1,&x2);
ans=root(x1,x2);
printf("%lf\n",ans);
return 0;
}
double root(double x1,double x2)
{
double y1,y2,y,x;
y1 = x1*x1*x1 - 11.1*x1*x1 + 38.8*x1 - 41.77;
y2 = x2*x2*x2 - 11.1*x2*x2 + 38.8*x2 - 41.77; //求出函数值
x = (x1*y2 - x2*y1)/(y2 - y1); //求出弦的零点
y = x*x*x - 11.1*x*x + 38.8*x - 41.77; //求出对应零点函数值的误差
if(fabs(y) < 0.00001) //两根精度
return x; //递归出口
else if(y*y2<0)
return root(x,x2); //对应函数值正负的改变
else
return root(x1,x);
}
循环的求法
#include<stdio.h>
#include<math.h>
double root(double,double);
int main()
{
double x1,x2,ans;
scanf("%lf%lf",&x1,&x2);
ans=root(x1,x2);
printf("%lf\n",ans);
return 0;
}
double root(double x1, double x2)
{
double x;
double f,f1,f2;
do
{
f1=x1 * x1 * x1 - 11.1 * x1 * x1 + 38.8 * x1 - 41.77;
f2=x2 * x2 * x2 - 11.1 * x2 * x2 + 38.8 * x2 - 41.77; //函数值求解
x = (x1 * f2 - x2 * f1)/ (f2-f1);
f=x * x * x - 11.1 * x * x + 38.8 * x - 41.77; //弦的零点
if (f*f1> 0)
x1 = x;
else
x2 = x; //相当于递归出口
}while (f <= -0.00001 || f >= 0.00001);
return x;
}