javascript - 为什么这个最小公分母函数返回 undefined 对于更高的数字输入

标签 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] ]));

最佳答案

现代 JS 有很多内置的功能来简化这段代码。如果我们稍微重写一下,可能会更容易发现哪里出了问题。我们还要以与我们实际使用它们的用途相匹配的方式命名这些函数/变量,因为能够理解您自己的代码是 future 工作的 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. 嗯嗯嗯...
  3. 这太天真了(数学告诉我们有大量的 k 值不可能产生结果,但无论如何我们都会检查它们)但是递增 1 意味着我们什么都不跳过,这意味着如果有 LCD,我们应该找到它。
  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

关于javascript - 为什么这个最小公分母函数返回 undefined 对于更高的数字输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53695038/

相关文章:

javascript - 计算特定 div 中表中的可见行数

c - 在代码片段的数组中为 TLB 未命中找到合适的步幅

javascript - 将 Javascript 数组转换为可读字符串

python - 生成四元对

javascript - 如何按关联数组值排序(复杂数组结构)?

javascript - 通过 handlebars.js 中的动态属性遍历对象

javascript - Google Chrome 扩展对于任何 getElement 返回未定义

javascript - 在 React 中使用数组设置状态

javascript - 如何停止 rethinkdb 将对象转换为数组?

javascript - 如何动态更改表中的列数但仍保持表布局不变?