Javascript Nodejs递归调用堆栈错误,但代码应该很好
这段代码在节点12出现错误,我想知道为什么Javascript Nodejs递归调用堆栈错误,但代码应该很好,javascript,node.js,Javascript,Node.js,这段代码在节点12出现错误,我想知道为什么 函数nloop(i,func){ 函数递归(obj,i,count){ obj[count+=1]=函数调用(null,count); if(count==i)返回obj; 返回递归(obj,i,count); }; 返回递归([],i-1,-1); }; var data=nloop(1000000,i=>Math.round(Math.random()*1000000)) 这段代码在节点12出现错误,我想知道为什么 节点12中的最大调用堆栈大小小
函数nloop(i,func){
函数递归(obj,i,count){
obj[count+=1]=函数调用(null,count);
if(count==i)返回obj;
返回递归(obj,i,count);
};
返回递归([],i-1,-1);
};
var data=nloop(1000000,i=>Math.round(Math.random()*1000000))代码>
这段代码在节点12出现错误,我想知道为什么
节点12中的最大调用堆栈大小小于1000000,这是代码完成所需的大小。我使用12.7.0进行了测试,发现最大堆栈大小为12461
原则上,尾部调用优化应该能够使此代码正常工作,但node不实现尾部调用优化(源代码:)您可以使用动态编程来防止此错误。使用循环并将每个结果存储在数组中,而不是使用递归函数。请查看此代码:
const i=()=>Math.round(Math.random()*1000000);
常量数据=(新数组(1000000)).fill(0).map(i);
控制台日志(数据)代码>我正在为性能使用递归。@IAMDEVONBUTTER使用递归并不总是会产生性能。@NicholasTower是的,我没有注意到=
符号!我认为这只是count+1
。谢谢,谢谢!有没有办法在大数据上增加和/或运行递归?如果没有尾部调用优化,就不可能了。但是你可以看看蹦床(例如,)。您提到您这样做是出于性能原因;我怀疑,如果使用循环,性能会比使用递归+蹦床更好。