欧几里德';s算法-JavaScript

欧几里德';s算法-JavaScript,javascript,algorithm,recursion,Javascript,Algorithm,Recursion,我是JavaScript新手,正在学习递归函数。具体来说,我正在研究欧几里德算法。除了第2行的基本情况“if(!b){return a;}之外,这一切对我来说都是有意义的。我知道在某个时候a%b将等于NaN,这是递归调用应该停止的时候。但是“if(!b)”在最简单的形式中是什么意思呢?我不能完全理解这一点。我提前感谢您的反馈 // Euclid's Algorithm var gcd = function(a, b) { if (!b) { return a;

我是JavaScript新手,正在学习递归函数。具体来说,我正在研究欧几里德算法。除了第2行的基本情况“if(!b){return a;}之外,这一切对我来说都是有意义的。我知道在某个时候a%b将等于NaN,这是递归调用应该停止的时候。但是“if(!b)”在最简单的形式中是什么意思呢?我不能完全理解这一点。我提前感谢您的反馈

// Euclid's Algorithm 

var gcd = function(a, b) {  
   if (!b) {  
       return a;  
   }  

   return gcd(b, a % b);  
};  
console.log(gcd(462, 910));

这就是欧几里德算法背后的基本原理

gcd(a, b) = gcd(b, a%b)
但是当
b
为0时除外。这种情况下的结果是什么?你可以想象0实际上有无限个因子:你可以用任何东西除以0,余数永远是0

由此,我们可以得出

gcd(a, 0) = a

这就是算法的停止情况。
if(!b)
实际上是检查
b==0
,在这种情况下返回
a

简单地说,在这种情况下,
!b
b==0
相同。零作为真值为假,因此
!0
将为真

换句话说,当
b
为零时,函数返回
a
,否则它将执行更多的递归级别

你认为
a%b
将变为
NaN
的论点实际上是错误的,
b
变为零,并且你检测到了这一点,这意味着你实际上从未将任何东西除以零得到
NaN
(!b)正在计算变量b以返回false的值。在JavaScript中,NaN是false,这意味着它不是false,但在布尔计算中它将计算为false


正如其他人所提到的,变量b将等于0而不是NaN。我刚才解释了NaN是如何计算的,这是为了回答最初的问题。

欧几里德算法的基本情况发生在其中一个参数等于零时,这意味着两个数的最大公约数是非零数。您可以参考此链接可查看一些示例:

我就是这样实现欧几里德算法的:

   function gcd(a, b) {
        // base cases
        if(a === 0) { return b;}
        if(b === 0) { return a;}

        // decrease and conqure - recursion
        return gcd(b, a % b);
    }

    console.log(gcd(9, 6));
    console.log(gcd(6, 9));

你可以在这里找到一些关于这方面的信息:在那篇文章之后,你可以在这里找到很多信息。谢谢你的资源!事实上,尼米克斯,虽然你的两句话都是对的,但第二句是不相关的,因为
b
从来没有真正变成
NaN
-当它达到零时,它会停止一步。欢迎来到StackOverflow!谢谢感谢您的回答。为了让答案更好,请在此处添加一些解释,说明您为什么认为这可能是对其他答案的改进。如果
num2
为零,会发生什么情况(以及您认为应该发生什么情况)?
//I'm glad that I can help others, here is my version:
//Euclid's algorithm:
//1)Find reminder of division m by n
//2)If remainder is zero, n is a solution
//3)Reduce(if r != zero)
const euclid = function(num1, num2){
    //compute the remainder:
    var remainder = num1 % num2;
    if(remainder == 0){
        return num2;
   
    }else{
        //step 3:
        num1 = num2;
        num2 = remainder;
       return euclid(num1, num2);
    }
}
//test the result:

console.log(euclid(80, 30));