我在if语句中使用了less than comparator;然而,即使它不应该,它也会评估为假

时间:2014-10-20 22:33:36

标签: javascript aptana

所以,我正在做一个涉及找到两个数字的最大公约数的程序。我有一个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的新手,所以我可能会遗漏一些东西,但似乎一切都在那里。谢谢你的帮助。

2 个答案:

答案 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)。