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

I'm using the less than comparator in an if statement; however, even when it shouldn't, it evaluates to false

本文关键字:不应该 false 结果 评估 比较器 if 语句 小于 然而      更新时间:2023-09-26

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

函数是递归的,当它第一次运行时,因为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,m是20和5的最大公约数。

正如@recursive在评论中指出的那样,这个解决方案已经考虑到了n>m的情况。当n>m时,gcd(m,n)的第一个返回是gcd(n,m)。