欧几里得的算法 - JavaScript

时间:2015-08-17 03:09:46

标签: javascript algorithm recursion

我是JavaScript的新手,我正在学习递归函数。具体来说,我正在研究Euclid的算法。这对我来说都是有意义的,除了第2行的基本情况“if(!b){return 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));

5 个答案:

答案 0 :(得分:1)

(!b)正在评估变量b以返回false值。在JavaScript中,NaN是假的,这意味着它不是假的,但它会在布尔评估中评估为false。

正如其他人所提到的,变量b将等于0而不是NaN。我只是在解释NaN如何为原始问题进行评估。

答案 1 :(得分:0)

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

gcd(a, b) = gcd(b, a%b)

但是b为0时除外。这种情况下的结果是什么?你可以想象0中实际上有无限因子:你可以把0除以任何东西,其余的总是0。

由此,我们可以推导出

gcd(a, 0) = a

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

答案 2 :(得分:0)

非常简单地说,在这种情况下,!bb == 0相同。零作为真值是错误的,因此!0将为真。

换句话说,当a为零时,函数返回b,否则它会继续通过更多的递归级别。

a % b将成为NaN的论点实际上是错误的 - b变为零,而您检测这一事实意味着您实际上从未任何内容除以零以获得NaN

答案 3 :(得分:0)

当参数之一等于零时,就会发生欧几里德算法的基本情况,这意味着两个数的最大公约数是非零数。您可以参考此链接查看一些示例: https://www.khanacademy.org/computing/computer-science/cryptography/modarithmetic/a/the-euclidean-algorithm

这就是我实现欧几里得算法的方法:

   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));

答案 4 :(得分:0)

//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));