该函数使用了递归调用来避免生成重复的随机数,但是缺少了递归调用的结束条件,导致函数在一定概率下会陷入死循环,最终导致程序崩溃。应该在递归调用之前加上结束条件,例如在调用函数的语句后面加上一个括号表示调用结束,即: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 遍历完所有元素后,递归调用就会结束,避免了死循环。

注意:

使用递归调用时,一定要注意结束条件,避免陷入死循环。

JavaScript 随机选择元素函数的递归死循环问题

原文地址: https://www.cveoy.top/t/topic/nsdd 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录