Нет, существует ограничение на количество вызовов функций, которые вы можете разместить в стеке вызовов, поэтому даже если ваша рекурсивная функция имеет достижимый базовый случай, она все равно выдаст ошибку, если число рекурсивных вызовов слишком велико.
Одним из обходных путей может быть использование метода под названием trampoline
, когда вы не выполняете рекурсивный вызов непосредственно внутри функции, но insted возвращает новую функцию, которая затем выполняется в цикле, пока не будет достигнут базовый случай,
Используя эту технику, ваша функция может выполнять столько рекурсивных вызовов, сколько вы хотите, потому что вы не размещаете больше этих вызовов функций в стек вызовов одновременно, поэтому она не будет переполнена.
var decimals = [];
var max = 20000;
function _recurse(){
decimals.push(Math.floor(Math.random()*10));
if(decimals.length === max) return;
return () => _recurse();
}
const trampoline = fn => (...args) => {
let res = fn(...args);
while (typeof res === 'function') { res = res(); }
return res;
}
const recurse = trampoline(_recurse);
recurse()
console.log(decimals);
Обратите внимание, что ваша проблема может быть решена без использования рекурсии гораздо более простым способом с использованием циклов.Например:
function createRandomSequence(amount) {
const decimals = [];
for (let i = 0; i < amount; i++) {
decimals.push(Math.floor(Math.random()*10));
}
return decimals;
}
console.log(createRandomSequence(10));