我是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));
答案 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)
非常简单地说,在这种情况下,!b
与b == 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));