【问题标题】:how to reset function's static variable in c++如何在 C++ 中重置函数的静态变量
【发布时间】:2017-12-25 03:30:14
【问题描述】:

当您第一次尝试使用以下函数时,它会给您正确的答案,即给出两个数字的 LCM(最小公倍数)。 对于使用新参数的第二次调用,静态变量不会从 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;
}

【问题讨论】:

  • 为什么需要它是静态的?
  • 使其成为非静态的并将其作为参数传递给lcm。更好的是,用循环替换递归。
  • 我正在做一个大项目,只是把这个简单的例子来表达我的问题,不幸的是,静态变量不能@drescherjm
  • 如果你想在函数之外触摸它,你必须让它成为全局的。如果你不想不小心改变它,把它作为privatestatic放到一个类中,根据需要friend函数。

标签: c++


【解决方案1】:

没有用于重置函数级静态变量的内置语言机制。尽管您可以构建自己的方式来传达将 static 重置为其初始值的需求,但这仍然是对语言的可读性差的滥用。

特别是,您永远不应该在递归函数中使用static 变量,因为不可重入递归函数几乎没有用处。此外,您的递归实现非常缓慢,因为它会一个接一个地尝试候选 lcms。输入两个相当大的素数会导致堆栈溢出。

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

【讨论】:

  • 这就是我想听到的答案,不要再因为这个例子而对我发火了 xD 只是为了传达我的问题。非常感谢
  • @NizarAlMshantaf 欢迎您!我想我知道这个例子来自哪里。不幸的是,该示例的质量非常低。 Here 是一个更好的实现,它使用递归来查找 gcd
【解决方案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);
}

现在你不需要公共作为参考,它更简单。

【讨论】:

    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    相关资源
    最近更新 更多