我们必须迭代地和递归地编写一个gcd计算器,并且我们得到一个测试脚本,我的程序失败2/10测试(gcd_iterative(1000, 48) = 1000
,gcd_iterative(48, 24) = 48
)。所以我用print语句向我的程序展示了它并且它起作用了。我一次开始删除1个语句,并且有1行,如果我删除该语句则会产生错误的答案。为什么会发生这种情况,我该如何解决?
using namespace std;
#include <sstream>
#include <string>
#include <iostream>
#include <cstdlib>
int gcd_iterative(int m, int n)
{
int r;
while(r != 0)
{
r = m % n;
m = n;
n = r;
}
return m;
}
int gcd_recursive(int m, int n)
{
if(n == 0)
{
return m;
}
else
{
return gcd_recursive(n, m % n);
}
}
int main(int argc, char *argv[])
{
if (argc != 3)
{
cerr << "Usage: " << argv[0] << " <integer m> <integer n>" << endl;
return 1;
}
istringstream iss;
iss.str(argv[1]);
int m;
if (!(iss >> m))
{
cerr << "Error: The first argument is not a valid integer." << endl;
return 1;
}
iss.clear();
iss.str(argv[2]);
int n;
if (!(iss >> n))
{
cerr << "Error: The second argument is not a valid integer." << endl;
return 1;
}
cout << "" << endl;
cout << "Iterative: gcd(" << m << ", " << n << ") = " << gcd_iterative(m, n) << endl;
cout << "Recursive: gcd(" << m << ", " << n << ") = " << gcd_recursive(m, n) << endl;
return 0;
}
print语句为cout << "" << endl;
。
答案 0 :(得分:3)
问题在于:
int r;
while(r != 0)
{
r = m % n;
m = n;
n = r;
}
return m;
r
的值未初始化为任何值,因此如果初始值为零,则算法将在while循环上终止,并且仅返回m
的值。
不需要C ++将堆栈变量的值初始化为任何默认值或其他任何值,因此r
变量中的值是前一个函数调用留在堆栈中的值。似乎恰好cout << endl;
在r
的正确堆栈位置留下非零值以具有非零值,并且实际运行算法。 (请注意,如果C ++确实提供了默认值,那么默认值大概可能为零,因此您仍然需要初始化)。
通常,您应该将堆栈变量的默认值初始化为安全值,而不是依赖于它们的默认值。因此,在这种情况下,修复是在第一次声明时将r
设置为任何非零值。例如。 int r = 1;
旁注:在C / C ++中,任何整数值都可以用作布尔值,零是false,因此您的while条件可以简化为while(r)
而不是{{ 1}};就while循环而言,这些是完全等效的表达式。
答案 1 :(得分:0)
当程序的结果发生这样的变化时,很可能你忘记了一些变量。在你的情况下,你看起来忘了初始化r:
int r;
while(r != 0)
&#39; R&#39;将得到一个任意值(无论发生在CPU寄存器中)。很可能没有print语句,r为零,因此while()循环永远不会运行。您希望显式设置为非零值。