未捕获的RangeError:超过最大调用堆栈大小,递归与随机数?



所以我知道当无限循环发生时,通过递归出现最大调用堆栈错误。但我有个奇怪的问题。在代码下的一切都很好,直到我在randomRow和randomCol下添加了这2条注释行。是否有可能创建无限循环与随机数或我错过了什么?

function insertNumbers(freeRCPos, grid, fields, num) {
//base case
if (fields.length === 0) return grid;

let randomRow = Math.floor(Math.random() * maxRows);
let randomCol = Math.floor(Math.random() * maxRows);
// if (grid[randomRow][randomCol].value !== undefined)
//   return insertNumbers(freeRCPos, grid, fields, num);
let newFields = [];
//there are in total 9 fields so it has to go through all of them  
for (let field of fields) {
//check if its already in field
if (field.includes(JSON.stringify([randomRow, randomCol]))) {
let res = freeRCPos.map((element: any) =>
element.map((pos: any) =>
pos === JSON.stringify([randomRow, randomCol]) ? true : false
)
);
if (
res.filter((el: any) => (el.includes(true) ? true : false)).length > 0
) {
grid[randomRow][randomCol].value = num;
newFields= fields.filter(
(_: any, fieldId: number) => fields.indexOf(field) !== fieldId
);
//return with modified fields and others to be able to complete base case
return insertNumbers(
freeRCPos.map((field: any) =>
field.map((pos: string) =>
pos?.startsWith("[" + randomRow) || pos?.endsWith(randomCol + "]")
? null
: pos
)
),
grid,
newFields,
num,
);
//else return same
} else {
return insertNumbers(freeRCPos, grid, fields, num);
}
//else return same
} else {
return insertNumbers(freeRCPos, grid, fields, num);
}
}
return grid;
}

我可能在这里放了很多不必要的代码,所以如果我需要缩短它,只要问。谢谢你的帮助。

如果随机数是grid中存在的索引(= Ifgrid[randomRow][randomCol].value !== undefined为真),则它将永远不会通过注释部分,并且它将继续使用相同的值调用自己。你需要在递归调用函数之前更新一些东西,并更接近基本情况,即fields.length === 0

最新更新