繁体   English   中英

RangeError:递归超出了最大调用堆栈大小

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM