在函数中具有布尔值“ recursiveCall”参数是一种好习惯吗?

时间:2019-06-10 14:21:27

标签: c++ recursion

我有一个调用自身的函数,但是为避免函数调用自身时发生无限递归,我传递了一个布尔变量,因此它不会再次调用自身。但是,这也意味着使用我的代码的人可以使用该函数并将其传递给true参数。

class Test
{
public:
  static bool doCheck(int x, bool recursiveCall = false)
private:
  int m_array {10, 5, 3, 25, 12, 0, -6};
  int tracker = 0;
};

bool Test::doCheck(int x, bool recursiveCall)
{
  if (m_array[tracker] > x)
  {
    //do stuff
    ++tracker;
    return true;
  }
  else if (!recursiveCall)
  {
    // reset tracker 
    tracker = 0;
    return doCheck(x, true);
  }

  return false;
}

int main()
{
  Test::doCheck(2); // returns true, m_array[tracker] now equals 5

  // The next call will go through the "else if" part which will reset the tracker
  // and return false, if we didn't call the function as recursive it would call itself infinitely !
  Test::doCheck(50);


  return 0;
}

编辑:根据要求,我提供了一个更好的示例。当然,我们可以在再次调用doCheck()之前执行m_array[tracker] > x,但这意味着我们的检查将执行两次,并且如果我们使用更复杂的算法检查某些内容,则可能会出现问题

这样做是一种好习惯吗?

1 个答案:

答案 0 :(得分:2)

不,那是个坏主意。而是重新编写您的基本案例,以便它总是独立存在。

您的示例永远不会明智地递归,因此它可能也是

void foo(int x)
{
    if (x > 10)
    { /* Do stuff here */ }
}