JavaScript循环bug:元素值达到最大值时未被清空问题咨询
问题原因
你代码的核心问题出在increment函数的调用逻辑和判断条件上:
- 你调用
increment(a,Indx,Indx)时,传入的第二个参数和第三个参数永远是同一个值,触发了if (prevIndex === null || index === prevIndex)的判断,直接返回了matrix,后面把index之后的所有元素重置为0的逻辑永远不会执行,自然达到最大值的元素不会被清空。
修复方案
只需要修改check函数里的increment调用逻辑,以及调整increment的参数传递即可,修复后的完整代码如下:
const letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'; function check(maxLength) { for (let matrixLength = 0; matrixLength < maxLength; matrixLength++) { let a = matrix(matrixLength); let Indx; let prevIndx = null; while (Indx !== null) { Indx = getIndex(a, letters.length); if (Indx === null) break; console.log(increment(a, Indx, prevIndx)); prevIndx = Indx; } } } function matrix(length) { let matrix = {}; for (let i = 0; i <= length; i++) { matrix[i] = 0; } return matrix; } function getIndex(matrix, arrLength) { const values = Object.values(matrix); for (let i = values.length - 1; i >= 0; i--) { if (matrix[i] !== arrLength - 1) { return i; } } return null; } function increment(matrix, index, prevIndex = null) { matrix[index]++; if (index !== prevIndex) { for (let i = index + 1; i < Object.values(matrix).length; i++) { matrix[i] = 0; } } return matrix; } check(3);
修复说明
- 新增
prevIndx变量存储上一次处理的索引,不再和当前Indx传相同值 - 调整
increment函数的判断逻辑,只要当前索引和上一次处理的索引不一致,就将当前索引之后的所有元素重置为0,刚好匹配你需要的「高位进位后低位清零」的逻辑 - 提前判断
Indx === null的情况,避免给increment传入null索引报错
内容的提问来源于stack exchange,提问作者Kate
相关产品推荐
相关产品推荐

