JavaScript 随机选择元素函数的递归死循环问题
该函数使用了递归调用来避免生成重复的随机数,但是缺少了递归调用的结束条件,导致函数在一定概率下会陷入死循环,最终导致程序崩溃。应该在递归调用之前加上结束条件,例如在调用函数的语句后面加上一个括号表示调用结束,即:randomSelect();。
const options = ['apple', 'banana', 'orange', 'kiwi', 'grape'];
var i = -1;
function randomSelect() {
const randomIndex = Math.floor(Math.random() * options.length);
if(i!==-1){
if(i == randomIndex){
//alert('调用函数'+i);
randomSelect();
}
else{
//alert('ss输出'+randomIndex);
i = randomIndex;
return options[randomIndex];
}
}
else{
i = randomIndex;
//alert(randomIndex);
return options[randomIndex];
}
}
解决方案:
在递归调用之前添加结束条件,例如:
const options = ['apple', 'banana', 'orange', 'kiwi', 'grape'];
var i = -1;
function randomSelect() {
const randomIndex = Math.floor(Math.random() * options.length);
if(i!==-1){
if(i == randomIndex){
// 递归调用之前添加结束条件
if (i === options.length - 1) {
return options[i];
}
randomSelect();
}
else{
i = randomIndex;
return options[randomIndex];
}
}
else{
i = randomIndex;
return options[randomIndex];
}
}
解释:
在代码中添加了 if (i === options.length - 1) { return options[i]; } 语句,表示当 i 等于数组的长度减 1 时,递归调用结束,返回最后一个元素。这样,在递归调用的过程中,当 i 遍历完所有元素后,递归调用就会结束,避免了死循环。
注意:
使用递归调用时,一定要注意结束条件,避免陷入死循环。
原文地址: https://www.cveoy.top/t/topic/nsdd 著作权归作者所有。请勿转载和采集!