对于每个子数组,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] ]));
答案 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()
做错了正确的事情,因此:一些控制台日志应该非常迅速地揭示出哪里出了问题。实际上,只有 这么多东西是错误的:
k
开始吗?k
的数字是否足够高?k
的增量是否错误?基本上就是这样。
k
个值的负载可能无法产生结果,但是无论如何我们都会对其进行检查),但是递增1表示我们什么也不跳过,这意味着有一个液晶显示器,我们应该找到它。很明显,这里是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