我正在寻找我写的递归算法中的问题。在递归函数中调用堆栈大小:最大调用堆栈大小低于预期
该算法会在某些输入中抛出RangeError: Maximum call stack size exceeded
(在Chrome中)错误。但我追踪的调用堆栈大小只有6k-9k。
This test(from this SO answer)表示Chrome中的最大调用堆栈大小约为42k。
运行一些测试后,我发现,在递归函数有争论似乎降低了可用的调用堆栈大小:
带参数:调用堆栈大小超出了〜31K( Chrome浏览器,在〜15K边)
var recursionA = function(a, b) {
count++;
if (count < 100000) {
recursionA(a, b);
}
}
没有参数:调用堆栈大小超出了〜42K(铬,〜16.5k上边缘)
var recursionB = function() {
count++;
if (count < 100000) {
recursionB();
}
}
- 任何人都可以解释,为什么可用的调用堆栈大小是显著降低,当函数被调用的参数。
- 由于我的递归函数需要2个参数:我如何利用浏览器的最大调用堆栈大小?
- 是否有其他因素可能会降低可用的调用堆栈大小?
'a'和'b'应该参加堆栈IMO的一部分。每次你用这些参数调用函数时,它们都被作为堆栈一部分的值复制。 – MinusFour
但他们不会立即从堆栈中删除? – jHilscher
只有在递归结束后才会发生,因为没有足够的空间。 – MinusFour