所以我知道當無限回圈發生時,通過遞回會出現最大呼叫堆疊錯誤。但我遇到了這個奇怪的問題。代碼中的所有內容都可以正常作業,直到我在 randomRow 和 randomCol 下添加這兩條注釋行。是否可以使用亂數創建無限回圈,或者我錯過了什么?
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;
}
我可能在這里放了很多不必要的代碼,所以如果我需要縮短它,請問。感謝幫助。
uj5u.com熱心網友回復:
如果亂數是grid(= ifgrid[randomRow][randomCol].value !== undefined為真)中的現有索引,它永遠不會傳遞注釋部分,它會繼續用相同的值呼叫自己。您需要在遞回呼叫函式之前更新一些內容并更接近基本情況,即fields.length === 0.
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/470944.html
標籤:javascript 反应 功能 递归 无限循环
上一篇:二叉樹中序遍歷-遞回
