gpt4 book ai didi

javascript - 当递归函数在 javascript 中可数时,最大调用堆栈大小超出 RangeError

转载 作者:行者123 更新时间:2023-11-28 12:15:27 26 4
gpt4 key购买 nike

我创建了一个脚本来将数字除以所选的小数位数。除非我设置大量小数位,否则一切正常。当十进制数字数组长度达到 ~2400 时,通过 Node.js 运行的文件会放弃,Chrome 在 ~1900 时放弃。

我简化了我的代码,下面的脚本示例在~20000十进制数字数组长度上抛出超过最大调用堆栈大小 RangeError。我认为当无限调用循环或递归函数时会抛出此错误,但在我的情况下,迭代次数是可数的。它可能是一个巨大的数字,但我的模块旨在对大数字进行数学运算。

为什么会发生这种情况?我可以避免发生此 RangeError 吗?

var decimals = [];
var max = 20000;

recurse();

function recurse() {
decimals.push(Math.floor(Math.random()*10));
if(decimals.length === max) return;
recurse();
}

最佳答案

不,您可以在调用堆栈上放置的函数调用数量是有限制的,因此即使您的递归函数具有可到达的基本情况,如果递归调用的数量太大,它仍然会抛出错误。

一种解决方法是使用名为“trampoline”的技术,在该技术中,您不会直接在函数内部执行递归调用,而是返回一个新函数,然后在循环中执行该函数,直到基本情况为止到达了。

使用这种技术,您的函数可以执行任意数量的递归调用,因为您不会同时将更多的函数调用放置到调用堆栈中,因此它不会溢出。

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));

关于javascript - 当递归函数在 javascript 中可数时,最大调用堆栈大小超出 RangeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50704116/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com