首页 > 解决方案 > 超过最大调用堆栈大小 JS

问题描述

我试图理解递归的概念,并想在我的代码中使用它(getUniqueInt 函数):

var getRandomInt = function (min, max) {
  return Math.floor(Math.random() * (max - min)) + min;
};

var getChosenNumbers = function (min, max) {
  var chosenNumbers = [];
  for (var k = min; k <= max; k++) {
    chosenNumbers.push(k);
  }
  return chosenNumbers;
};

var arrayOfNumbers = getChosenNumbers(1, 8);

var getUniqueInt = function (min, max) {
  var uniqueNumber;
  var randomNumber = getRandomInt(min, max);
  if (arrayOfNumbers.indexOf(randomNumber) !== -1) {
    uniqueNumber = randomNumber;
    arrayOfNumbers.splice(arrayOfNumbers.indexOf(uniqueNumber), 1);
  } else {
    uniqueNumber = getUniqueInt(min, max);
  }
  return uniqueNumber;
};

但我最终得到了这个: Uncaught RangeError: Maximum call stack size exceeded

我究竟做错了什么?我的代码(我的意思是递归部分)是否有意义或完全错误?

标签: javascriptrecursion

解决方案


您的代码没有意义,抱歉,这就是原因

  • 设置最小值=0,最大值=10

  • getRandomInt返回 0-10 范围内的随机整数

  • getChosenNumbers返回 int FROM 0-10 的数组,表示 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

  • arrayOfNumbers[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]现在是

getUniqueInt根本无法获得 uniq,因为所有可能的随机值getRandomInt都已经在getChosenNumbers

这就是为什么

 else {
    uniqueNumber = getUniqueInt(min, max);
  }

被称为无限次,因为

arrayOfNumbers.indexOf(randomNumber) !== -1

从来都不是真的


推荐阅读