我们在编程类中使用了数值方法,引入我们的第一个算法是根寻找的二分法。这是我尝试使用递归实现它:
#include <math.h>
#include <stdio.h>
#define tolerance 0.00001
double my_function(double z){
double answer = 5*pow(z,2) + 5*z - 2;
return answer;
}
double bisection(double (*fxn)(double),double a, double b){
double m = ((a+b)/2);
if (fabs(b-a) < tolerance){
double root = a;
printf("value of a is %lf\n",root);
return a;
}
else if (fxn(m) > 0){
b = m;
}
else if (fxn(m) < 0){
a = m;
}
bisection(my_function, a, b);
}
int main(){
double g = 0.01;
double z = 1;
double x = bisection(my_function,g,z);
printf("root is %lf\n",x);
return 0;
}
这是输出:
value of a is 0.306225
root is nan
根是正确的(稍微偏离,但在公差范围内)但在介于值和打印之间的某处,它会以某种方式变成NaN。我很难过。我做错了什么?
答案 0 :(得分:4)
您没有从递归调用返回。将bisection
中的最后一个语句更改为
return bisection(my_function, a, b);
答案 1 :(得分:0)
我的第一个猜测:
中的
部分
if (fabs(b-a) < tolerance){
double root = a;
printf("value of a is %lf\n",root);
return a;
}
您返回的是一个而不是root。尝试返回root,看看是否有帮助。