【问题标题】:C++: Recursive Bisection Algorithm Keeps Returning 0C++:递归二分算法不断返回 0
【发布时间】:2021-04-22 14:32:08
【问题描述】:

我正在尝试从头开始实现一个二等分求根算法,我传递给它的方程是 x^2 - 42 = 0。我的代码不断给出输出“42 的根为 0,误差为 1e -05.”,这意味着我的二分算法的递归堆栈由于某种原因一直返回 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;”行,因为我的编译器在没有它的情况下抛出“非 void 函数不会在所有控制路径中返回值”。如何更改我的代码以包含所有递归路径的返回值,但仍然产生正确的答案?我的算法的基本设计是否有错误,还是一个简单的修复?

【问题讨论】:

  • return solve(....?
  • 首先,有ab的成员,还有同名的参数,没有用。无论如何,如果您使用调试器单步执行代码,您可以自己轻松解决这个问题。试着找一个很好的视频教程来解释如何用你的 IDE 来做这件事,这是一个非常有用的工具。

标签: c++ recursion bisection


【解决方案1】:

除了代码的其他问题,您需要对solve 的结果进行实际操作。通常这意味着 return 直接从 solve 获取结果,直到您达到基本情况并返回:

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);
      }
    }
}

【讨论】:

  • 这解决了我的问题。非常感谢您的帮助:)
  • @arnavlohe15 请将其标记为已接受。 :)
猜你喜欢
  • 2012-02-23
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
  • 2020-10-26
  • 2018-07-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多