Javascript I';m在if语句中使用小于比较器;然而,即使它不应该';t、 它的计算结果为false

Javascript I';m在if语句中使用小于比较器;然而,即使它不应该';t、 它的计算结果为false,javascript,aptana,Javascript,Aptana,所以,我正在做一个程序,其中包括寻找两个数的最大公约数。我有一个if语句,用作基本情况;但基本情况总是会触发,即使不应该触发 代码如下所示: function gcd(m, n) { if(m < 1 || n < 1) { return 55; } return gcd(n, m % n); } 功能gcd(m,n) { if(mm的情况。 当n>m时,gcd(m,n)的第一个返回值是gcd(n,m)。当m%n为零时会发

所以,我正在做一个程序,其中包括寻找两个数的最大公约数。我有一个if语句,用作基本情况;但基本情况总是会触发,即使不应该触发

代码如下所示:

    function gcd(m, n)
{
    if(m < 1 || n < 1) 
    {
        return 55;
    }

    return gcd(n, m % n);
}
功能gcd(m,n)
{
if(m<1 | n<1)
{
返回55;
}
返回gcd(n,m%n);
}

我把55作为一些随机值放在里面,但即使我启动Chrome或Firefox的控制台并输入gcd(20,5),它也会返回55。这两个数字显然都不少于一个。我是JavaScript新手,所以我可能遗漏了一些东西,但似乎一切都在那里。感谢您的帮助。

函数是递归的,当它第一次运行时,因为m和n不小于1,它会再次返回函数的值(这似乎一直持续到它返回55)


在第一次运行后,使用示例中提供的数字再次调用函数,但n作为m%n传入,在本例中为20%5,等于0。现在当它运行时,n小于1,所以它返回55,显然你不理解递归和停止条件

正确的算法是

function gcd(m, n)
{
    if (n == 0){
        return m;
    }

    return gcd(n, m % n);
}
让我们把它分解一下:

gcd(20,5)->gcd(5,0)

当您的算法调用gcd(5,0)时,由于n小于0,它返回55

所以,实际上基本情况并不总是像你说的那样触发,它只会在第二次调用时触发。正确的算法也会发生同样的情况,但正确的条件会得到正确的答案。因为n是0,它返回m,它是20和5的最大公约数

正如@recursive在注释中指出的,该解决方案已经考虑了n>m的情况。
当n>m时,gcd(m,n)的第一个返回值是gcd(n,m)。

m%n
为零时会发生什么?正如我在您的代码中看到的,结果是55是正常的。也许您的逻辑在这里是错误的。还需要说明
n
大于
m
的调用@Pointy:我认为不是。或者换句话说,它已经被考虑进去了。@BrunoCalza:我认为它在没有你的改变的情况下运行得很好。原始版本似乎可以处理它。我认为您是@recursive。美好的