C++:递归二分算法不断返回 0
C++: Recursive Bisection Algorithm Keeps Returning 0
我正在尝试从头开始实现二分求根算法,我传递给它的方程是 x^2 - 42 = 0。我的代码不断给出输出“42 的根在错误中为 0 1e-05.”,这意味着我的二分法算法的递归堆栈由于某种原因保持 returning 0。代码如下:
#include <iostream>
#include <cmath>
using namespace std;
class Bisection
{
public:
double a;
double b;
double c;
double epsilon;
void set_values(double, double, double);
double f(double x)
{
return x*x - 42;
}
double solve(double a, double b, double epsilon)
{
c = (a+b)/2.0;
if(abs(f(c)) < epsilon)
{
return c;
}
else
{
if (f(a) * f(c) < 0.0)
{
b = c;
solve(a, b, epsilon);
}
else if (f(c) * f(b) < 0.0)
{
a = c;
solve(a, b, epsilon);
}
}
return 0;
}
};
void Bisection::set_values(double left, double right, double error)
{
a = left;
b = right;
epsilon = error;
}
int main()
{
Bisection myObj;
myObj.set_values(0.0, 10.0, 0.00001);
//cout << myObj.f(7);
cout << "The root of 42 is " << myObj.solve(myObj.a, myObj.b, myObj.epsilon) << " within an error of " << myObj.epsilon << ".";
return 0;
}
我必须包括“return 0;”行,因为我的编译器在没有它的情况下返回“非空函数不 return 所有控制路径中的值”。我怎样才能更改我的代码以包含所有递归路径的 return 值,但仍会产生正确的答案?我的算法基本设计是否有错误,还是简单的修复?
抛开代码的其他问题,您需要对 solve
的结果进行实际处理。通常这意味着 return
直接从 solve
计算结果,直到达到基本情况并且 return 即:
double solve(double a, double b, double epsilon)
{
c = (a+b)/2.0;
if(abs(f(c)) < epsilon)
{
return c; //this is your base case
}
else
{
if (f(a) * f(c) < 0.0)
{
b = c;
return solve(a, b, epsilon);
}
else if (f(c) * f(b) < 0.0)
{
a = c;
return solve(a, b, epsilon);
}
}
}
我正在尝试从头开始实现二分求根算法,我传递给它的方程是 x^2 - 42 = 0。我的代码不断给出输出“42 的根在错误中为 0 1e-05.”,这意味着我的二分法算法的递归堆栈由于某种原因保持 returning 0。代码如下:
#include <iostream>
#include <cmath>
using namespace std;
class Bisection
{
public:
double a;
double b;
double c;
double epsilon;
void set_values(double, double, double);
double f(double x)
{
return x*x - 42;
}
double solve(double a, double b, double epsilon)
{
c = (a+b)/2.0;
if(abs(f(c)) < epsilon)
{
return c;
}
else
{
if (f(a) * f(c) < 0.0)
{
b = c;
solve(a, b, epsilon);
}
else if (f(c) * f(b) < 0.0)
{
a = c;
solve(a, b, epsilon);
}
}
return 0;
}
};
void Bisection::set_values(double left, double right, double error)
{
a = left;
b = right;
epsilon = error;
}
int main()
{
Bisection myObj;
myObj.set_values(0.0, 10.0, 0.00001);
//cout << myObj.f(7);
cout << "The root of 42 is " << myObj.solve(myObj.a, myObj.b, myObj.epsilon) << " within an error of " << myObj.epsilon << ".";
return 0;
}
我必须包括“return 0;”行,因为我的编译器在没有它的情况下返回“非空函数不 return 所有控制路径中的值”。我怎样才能更改我的代码以包含所有递归路径的 return 值,但仍会产生正确的答案?我的算法基本设计是否有错误,还是简单的修复?
抛开代码的其他问题,您需要对 solve
的结果进行实际处理。通常这意味着 return
直接从 solve
计算结果,直到达到基本情况并且 return 即:
double solve(double a, double b, double epsilon)
{
c = (a+b)/2.0;
if(abs(f(c)) < epsilon)
{
return c; //this is your base case
}
else
{
if (f(a) * f(c) < 0.0)
{
b = c;
return solve(a, b, epsilon);
}
else if (f(c) * f(b) < 0.0)
{
a = c;
return solve(a, b, epsilon);
}
}
}