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