如果在递归函数内调用“break”,它会中断所有被调用的迭代还是会取消该实例?具体来说,我想了解以下代码:
//take a 2d array and check if it is in _switch
function checkSwitch(arr2d, rates, n = 0, found = []){
if(n===arr2d.length){
inCase(found, rates)
break
}
for(let i in arr2d[n]){
if(deepCheck(_switch, [...found, arr2d[n][i]]))
checkSwitch(arr2d, rates, n+1, [...found, arr2d[n][i]])
}
return false
}
我有一个二维数组(数组的数组),我检查每个数组中的一个元素是否作为嵌套对象键包含在我正在制作的这个 _switch 中。当我有一个全部匹配时,然后运行一个函数,我想继续检查二维数组以查看是否有其他匹配。
但是,如果我遇到一个没有匹配项的数组,那么我需要中断递归的所有迭代以提高效率,因为我知道从逻辑上讲不可能有任何一个匹配。
所以我需要能够破坏一个实例并破坏所有实例。我不知道如何获得这个。
更正的代码和经验教训 我很惊讶在研究人工智能的过程中我对智能到底是什么有了如此多的了解。在递归函数中添加返回值将破坏当前实例,如果您在调用递归时检查返回值,则可以回传整个递归的崩溃。这是新代码:
function checkSwitch(arr2d, rates, n = 0, found = []) {
if (n === arr2d.length) {
inCase(found, rates);
return true;
}
let tf = false
for (let i in arr2d[n]) {
if (deepCheck(_switch, [...found, arr2d[n][i]])) {
if (!checkSwitch(arr2d, rates, n + 1, [...found, arr2d[n][i]])) {
return false;
} else {
tf = true
}
}
}
return tf;
}
返回 true 意味着中断此迭代并继续,而返回 false 意味着中断所有内容。我在 for 循环之前添加了一个切换,这样如果我们碰巧从每个数组中获得一个匹配,那么从逻辑上讲,我们需要检查所有其他可能性,因为它们可能是有效的。否则,如果我们通过了 for 而没有得到 true,那么就会破坏一切,因为不再有任何可能性。
最佳答案
都不是。 break
和 continue
等循环控制语句仅在循环内有效(for
、while
、do
,或开关
)。代码中的 break
语句不在循环中,因此此代码将导致语法错误。
“突破”递归函数的多个级别的唯一方法是抛出异常。对于这种情况,这可能并不理想;对于您的情况来说,更好的选择可能是使用嵌套循环而不是递归。
关于javascript - javascript "break"会完全停止递归函数还是只是停止该实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53385924/