递归最大公分母解释

时间:2014-11-20 19:20:37

标签: javascript math

我找到了这个解决方案:

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

我试图绕过它的工作方式,我被困在第二行if (b) {

显然,如果b存在,它应该通过函数(本身)运行吗?是真的?但是这次它运行它a现在是b的值,而b现在是a的余数除以b

这是否意味着只要用户为Math.abs(a)设置值,它就永远不会返回b

有人可以向我解释一下吗?

3 个答案:

答案 0 :(得分:1)

每次调用递归函数时,它都会传递ba % b)的新值。所以当b达到0时,它会调用return Math.abs(a)

答案 1 :(得分:1)

我认为维基百科很好地解释了它:http://en.wikipedia.org/wiki/Greatest_common_divisor#Using_Euclid.27s_algorithm

  

要计算gcd(48,18),将48除以18,得到2的商和12的余数。然后将18除以12,得到1的商和6的余数。然后将12除以6得到0的余数,这意味着6是gcd。请注意,我们忽略了每个步骤中的商,除了注意剩余部分何时达到0,表示我们已经得到了答案。

因此,在您的算法中,b始终是前一个除法的余数,而前一个b。

如果b,新余数大于0,它将在if语句中返回true,因此我们忽略a并使用新输入运行新算法。

答案 2 :(得分:0)

这是Euclid's algorithm找到gcd。最后一个abs确保结果是非负的。