当您第一次尝试使用以下功能时,它会给出正确的答案,为您提供两个数字的最小公倍数(最小公倍数)。 对于使用新参数的第二次调用,静态变量不会从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;
}
答案 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作为引用,而且它更简单。