我找到了这个解决方案:
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
有人可以向我解释一下吗?
答案 0 :(得分:1)
每次调用递归函数时,它都会传递b
(a % 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确保结果是非负的。