如何在c ++中重置函数的静态变量

时间:2017-12-24 19:10:19

标签: c++

当您第一次尝试使用以下功能时,它会给出正确的答案,为您提供两个数字的最小公倍数(最小公倍数)。 对于使用新参数的第二次调用,静态变量不会从1开始,这将给我错误的答案。 无论如何在进行递归循环之前将其设置为1?

int lcm(int a, int b)
{ 
    static int common = 1;

    if (common % a == 0 && common % b == 0)
        return common;

     common++;
     lcm(a, b);
     return common;
}

2 个答案:

答案 0 :(得分:4)

没有用于重置功能级静态变量的内置语言机制。虽然您可以构建自己的方式来传达将static重置为其初始值的需求,但它仍然是一种难以理解的语言滥用。

特别是,你不应该在递归函数中使用static变量,因为非重入递归函数几乎是无用的。此外,您的递归实现非常缓慢,因为它会逐个尝试候选lcm。给它两个相当大的素数会导致堆栈溢出。

以不使用lcm的方式重写递归static

答案 1 :(得分:2)

您不应该为这种情况使用静态变量。将其用作参数:

int lcm(int a, int b, int &common)
{ 
  if (common % a == 0 && common % b == 0)
    return common;

  common++;
  lcm(a, b, common);
  return common;
}

// now you can also overload it to avoid using argument:
int lcm(int a, int b)
{
    int common = 1;
    return lcm(a, b, common);
}

使用静态变量,您还可以破坏函数的线程安全性。你必须确保只有一个线程正在调用它。

<强> 修改

如果你稍微改变一下这个功能:

int lcm(int a, int b, int common = 1)
{ 
   if (common % a == 0 && common % b == 0)
      return common;

   return lcm(a, b, ++common);
}

现在你不需要将common作为引用,而且它更简单。