Превышен максимальный стек вызовов RangeError - PullRequest
1 голос
/ 15 марта 2019
smallestInteger = (stack,numbers,k) => {
    if (stack.length == 0){
        stack.push(numbers[k]);
    }
    if (numbers[k] <= stack[stack.length-1]){
        stack.pop();
        stack.push(numbers[k]);
    } 
    console.log(`stack is ${stack}`)
    console.log("k:" + k);
    return (k == 0) ? stack[stack.length-1] : smallestInteger(stack,numbers,k-1);
}

var smallestInteger = function(numbers) {
    let stack = []; 
    let smallest = smallestInteger(stack ,numbers,numbers.length - 1);
    return `the smallest integer is ${smallest}`;
}

var testCases = [[10,2,5,7,15,9], [1,2,3,4]];
for (let testCase of testCases){
    console.log(smallestInteger(testCase));
}

Запуск > node smallestInteger.js выдает эту ошибку:

RangeError: Maximum call stack size exceeded
    at smallestInteger (smallestInteger.js:17:31)
    at smallestInteger (smallestInteger.js:19:17)
    at smallestInteger (smallestInteger.js:19:17)
    at smallestInteger (smallestInteger.js:19:17)
    at smallestInteger (smallestInteger.js:19:17)
    at smallestInteger (smallestInteger.js:19:17)
    at smallestInteger (smallestInteger.js:19:17)
    at smallestInteger (smallestInteger.js:19:17)
    at smallestInteger (smallestInteger.js:19:17)
    at smallestInteger (smallestInteger.js:19:17)

Кстати, код не доходит до операторов консоли console.log, как мне решить эту проблему?

Две функции smallestInteger имеют разные конструкторы (первый имеет 1 аргумент, другой имеет 3) как переопределение, поэтому я не предполагаю, что они заменяют друг друга. Где вы видите, что он получает 2 аргумента, он получает 3 аргумента, как и ожидалось. Наконец, функция smallestInteger вызывает вспомогательную функцию smallestInteger, которая имеет условие выхода после ?, то есть k == 0, поэтому она не должна продолжаться вечно. По-прежнему получаю ту же ошибку

1 Ответ

1 голос
/ 15 марта 2019

Javascript не позволяет перегружать функции.Для этого нужно быть креативным.Например:

function smallestInteger(stack,numbers,k){
if (arguments.length == 1) {
    numbers = stack;
    stack = []; 
    let smallest = smallestInteger(stack ,numbers,numbers.length - 1);
    return `the smallest integer is ${smallest}`;
  }

if (stack.length == 0){
    stack.push(numbers[k]);
}
if (numbers[k] <= stack[stack.length-1]){
    stack.pop();
    stack.push(numbers[k]);
} 
return (k == 0) ? stack[stack.length-1] : smallestInteger(stack,numbers,k-1);
}

var testCases = [[10,2,5,7,15,9], [1,2,3,4]];
for (let testCase of testCases){
    console.log('testCase : ', testCase);
    console.log(smallestInteger(testCase));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...