Javascript 如何强制node.js执行更深层次的递归?
我有一个记忆的递归算法Javascript 如何强制node.js执行更深层次的递归?,javascript,algorithm,node.js,recursion,Javascript,Algorithm,Node.js,Recursion,我有一个记忆的递归算法f(n) 当我运行f(1000)时,一切正常,运行不到一分钟 当我运行f(10000)时,我得到一个范围错误/超过了最大调用堆栈大小 我不相信这个错误与我的算法的效率有任何关系(这是由于记忆而产生的多项式),而且更像是一个配置问题 我试着做了node app.js--stack size=32000,但这并没有使错误消失。我原以为当前堆栈大小的10倍就足够了。堆栈大小是否可能太小,或者是否有办法强制/设置节点中的配置来处理n=10000情况 而且--stack size选项
f(n)
当我运行f(1000)
时,一切正常,运行不到一分钟
当我运行f(10000)
时,我得到一个范围错误/超过了最大调用堆栈大小
我不相信这个错误与我的算法的效率有任何关系(这是由于记忆而产生的多项式),而且更像是一个配置问题
我试着做了node app.js--stack size=32000
,但这并没有使错误消失。我原以为当前堆栈大小的10倍就足够了。堆栈大小是否可能太小,或者是否有办法强制/设置节点中的配置来处理n=10000
情况
而且--stack size选项似乎没有任何作用……我将其减少为“1”,我的程序运行速度也一样快。这里只需一个2便士的提示: 如果您的应用程序抛出堆栈溢出错误,则意味着您一次就做了太大的事情,继承了太多的作用域
考虑将登录分为异步函数,这样它就可以在不同的上下文中执行调用,防止出现堆栈溢出异常问题,并允许应用程序在整个逻辑中共享计算资源,不要自私地在一个实际上是瓶颈的函数中使用它。似乎节点要求在执行文件名之前放置其启动标志
node --stack-size=32000 app.js
要么不使用递归,将其分解为更小的异步批(如果可能),要么尝试y-combinator……此外,我相信ES6将允许正确的尾部调用,这意味着您不应该有调用堆栈问题(假设您立即返回)@cookiemonster谢谢:)尝试将
堆栈大小
放在文件名之前。只是做了一点测试,这似乎起了作用node--stack size=32000 app.js
@cookie monster请添加您的注释作为答案…当我增加堆栈大小时,它不会出错…是的,因为之后的参数被认为是应用程序的参数,而不是节点引擎的参数。@Joe:这很有意义。