![](/img/trans.png)
[英]Chrome Uncaught RangeError: Maximum call stack size exceeded click recursion
[英]RangeError: Maximum call stack size exceeded with recursion
我正在尝试解决 Codewars 上的这个 kata: https://www.codewars.com/kata/56e56756404bb1c950000992/train/javascript ,我有一个我认为应该是正确的方法,但它会引发 RangeError。 这是我的代码:
function sumDifferencesBetweenProductsAndLCMs(pairs){
return pairs.reduce((acc, curr) => {
// LCM * GCD = product
return acc + (curr[0] * curr[1] * (1 - 1 / GCD(curr)))
}, 0)
}
function GCD(pair) {
// Euclidean algorithm
let a = Math.max(...pair);
let b = Math.min(...pair);
let r = a % b;
if (r == 0) {
return b;
}
return GCD([b, r]);
}
我哪里错了? 我还能如何实现欧几里得算法?
我不确定我是否在这里得到任何数学知识,但跳过零似乎可以阻止它尝试永远递归。
任何 % 0 都会给出NaN
并且可能任何 % NaN 都会给出NaN
并且 NaN == 0 是假的,所以如果你从输入 GCD 的零值开始,递归就无法终止。
function sumDifferencesBetweenProductsAndLCMs(pairs){ return pairs.reduce((acc, curr) => { // LCM * GCD = product if(Math.min(...curr) === 0) return acc; // Skip zeros return acc + (curr[0] * curr[1] * (1 - 1 / GCD(curr))) }, 0) } function GCD(pair) { // Euclidean algorithm let a = Math.max(...pair); let b = Math.min(...pair); let r = a % b; if (r == 0) { return b; } return GCD([b, r]); } console.log(sumDifferencesBetweenProductsAndLCMs([[15,18], [4,5], [12,60]]),840); console.log(sumDifferencesBetweenProductsAndLCMs([[1,1], [0,0], [13,91]]),1092); console.log(sumDifferencesBetweenProductsAndLCMs([[15,7], [4,5], [19,60]]),0); console.log(sumDifferencesBetweenProductsAndLCMs([[20,50], [10,10], [50,20]]),1890); console.log(sumDifferencesBetweenProductsAndLCMs([]),0);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.