所以,我正在做一个涉及找到两个数字的最大公约数的程序。我有一个if语句用作基本情况;但基本情况总会触发,即使它不应该触发。
代码如下所示:
function gcd(m, n)
{
if(m < 1 || n < 1)
{
return 55;
}
return gcd(n, m % n);
}
我把55放在那里作为一些随机值,但即使我启动Chrome或Firefox的控制台并输入gcd(20,5),它也会返回55.这两个数字显然不小于一。我是JavaScript的新手,所以我可能会遗漏一些东西,但似乎一切都在那里。谢谢你的帮助。
答案 0 :(得分:1)
该函数是递归的,当它第一次运行时因为m和n不小于1它再次返回函数的值(这似乎一直持续到它返回55)
使用您在第一次运行后在示例中提供的数字再次调用该函数,但是n作为m%n传入,在这种情况下是20%5,等于0.所以现在当它运行时n更少超过1所以它返回55
答案 1 :(得分:1)
您显然不了解递归和停止标准。
正确的算法是
function gcd(m, n)
{
if (n == 0){
return m;
}
return gcd(n, m % n);
}
让我们分解一下:
gcd(20,5) - &gt; GCD(5,0)
当你的算法调用gcd(5,0)时,由于n小于0,它返回55。
所以,实际上基本情况并不总是如你所说的那样触发,它只在第二次调用时触发。使用正确的算法也会发生同样的情况,但正确的条件会带来正确的答案。由于n为0,它返回m,这是20和5的最大公约数。
正如@recursive在评论中所指出的,这个解决方案已经解决了案例n&gt;米 当n> m,gcd(m,n)的第一次返回是gcd(n,m)。