为什么对于较高的数字输入,此最低公分母函数返回未定义

时间:2018-12-09 17:50:29

标签: javascript arrays

对于每个子数组,index [0]是分子,而index [1]是分母。我正在尝试创建一个函数,该函数返回子数组中所有“分数”的最低公分母。我的代码适用于较小的数字,但在某些时候停止工作并返回未定义。

const convertFrac = (lst) => {
    let final = [];
    for (let i = 0; i < lst.length; i++) {
       final.push(lst[i][1]);
    }
    let count = 1;
    for (let j = 0; j < final.length; j++) {
        count *= final[j];
    }
    for (let k = 1; k <= count; k++) {
        function multiplier(currentValue) {
            return k % currentValue === 0;
          }
        if (final.every(multiplier)) {
            return k;
        }
        else {
            return count;
        }
    }

}
console.log(convertFrac([ [3, 318493911], [1, 611139393] ]));

1 个答案:

答案 0 :(得分:2)

现代JS具有许多内置功能来简化此代码。如果我们稍微重写一下,可能会更容易发现问题所在。而且,让我们以与我们实际使用它们的方式匹配的方式来命名这些函数/变量,因为能够理解您自己的代码是将来工作的99%:

// There is no "this" preservation necessary here, so just write a function.
function findLCD(fractions) {

  // push all denominators to separate array
  let denominators = fractions.map(i => i[1]);

  // obtain a common multiple by multiplying all denominators
  let denominatorProduct = denominators.reduce((tally, value) => tally * value, 1);

  // loop over all integers up to the denominator product,
  // and see if any of those work as LCD, starting at 2 (not 1!)
  for (let k = 2; k < denominatorProduct; k++) {
    if (denominators.every(value => k % value === 0)) return k;
  }
}

我们现在可以进行一些简单得多的调试,因为没有太多代码可以摆弄。显然,denominators.every()做错了正确的事情,因此:一些控制台日志应该非常迅速地揭示出哪里出了问题。实际上,只有 这么多东西是错误的:

  1. 我们是从正确的k开始吗?
  2. k的数字是否足够高?
  3. k的增量是否错误?
  4. 箭头功能使用的数学错误吗?

基本上就是这样。

  1. 我们不能真正开始“太早”来找到结果,尽管从1开始肯定会浪费一些时间,因为从定义上讲1从来就不是LCD。
  2. hmmmmmmm ...
  3. 这太天真了(数学告诉我们有k个值的负载可能无法产生结果,但是无论如何我们都会对其进行检查),但是递增1表示我们什么也不跳过,这意味着有一个液晶显示器,我们应该找到它。
  4. 不,那正是应该的。

很明显,这里是2的问题,我们还可以看到代码注释也不正确,因此解决方案涉及更改代码和文档:

...
  ...

  // loop over all integers up to and including the denominator product,
  // and see if any of those work as LCD, starting at 2 (not 1!)
  for (let k = 2; k <= denominatorProduct; k++) {
    if (denominators.every(value => k % value === 0)) return k;
  }
}

现在产生:

console.log(findLCD([ [3, 30], [1, 6] ])); // 30
console.log(findLCD([ [3, 31], [1, 6] ])); // undefined: let's do more debugging!
console.log(findLCD([ [3, 38], [1, 6] ])); // 114
console.log(findLCD([ [3, 3111], [1, 6111] ])); // 6337107