Javascript 如何找到最大公约数

Javascript 如何找到最大公约数,javascript,math,greatest-common-divisor,Javascript,Math,Greatest Common Divisor,我想用JavaScript找到最大的公约数 有人曾经这样做过并愿意分享吗?这里有一个递归解决方案 var gcd = function(a, b) { if (!b) { return a; } return gcd(b, a % b); } 我们的基本情况是b等于0。在本例中,我们返回a 当我们递归时,我们交换输入参数,但我们将a/b的剩余部分作为第二个参数传递。摘自维基百科 function egcd(a, b) { if (a == 0)

我想用JavaScript找到最大的公约数


有人曾经这样做过并愿意分享吗?

这里有一个递归解决方案

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

  return gcd(b, a % b);
}
我们的基本情况是
b
等于
0
。在本例中,我们返回
a

当我们递归时,我们交换输入参数,但我们将
a/b
的剩余部分作为第二个参数传递。

摘自维基百科

function egcd(a, b) {
    if (a == 0)
        return b;

    while (b != 0) {
        if (a > b)
            a = a - b;
        else
            b = b - a;
    }

    return a;
}
递归:

function gcd_rec(a, b) {
    if (b) {
        return gcd_rec(b, a % b);
    } else {
        return Math.abs(a);
    }
}
迭代:

function gcd(a,b) {
    a = Math.abs(a);
    b = Math.abs(b);
    if (b > a) {var temp = a; a = b; b = temp;}
    while (true) {
        if (b == 0) return a;
        a %= b;
        if (a == 0) return b;
        b %= a;
    }
}
  • 按用户评论编辑

递归不是最快的。@Florian好的,谢谢。我错过了OP要求最快解决方案的地方。他没有问。我想警告人们不要在现实生活中使用这种方法。这段代码可以写在一行中,说
var gcd=function(a,b){return(!b)→a:gcd(b,a%b);}。顺便说一下,这是一个很好的解决方案+1@FlorianF:既然ES2015(又称ES6)规范要求尾部调用优化,那么一旦引擎达到规范要求,它就不再是真正的递归了。:-)
if(a<0)a=-a
你也可以做
a=Math.abs(a)(下一行相同)