【问题标题】:Is it possible to increase the recursion limit in SpiderMonkey?是否可以增加 SpiderMonkey 中的递归限制?
【发布时间】:2010-01-20 21:09:29
【问题描述】:

我目前正在使用 JavaScript 解决 Project Euler 中的问题。在大多数情况下,我一直在使用for 循环来遍历问题,但想使用递归函数。但是,似乎所有 JavaScript 引擎都对它们可以处理的递归量有所限制。

我编译/安装了SpiderMonkey 以尝试从shell 运行,但仍然得到18: InternalError: too much recursion

有没有办法增加 SpiderMonkey 中的递归限制,或者这只是一个坏主意

代码示例:

function cycle(x)
{
    if (check_divisble(x))
    {
        print(i + ' is divisble by 1 - 20' + '\n');
        return;
    }


    x+=20;
    cycle(x);
}

cycle(50400);

感谢您的帮助。

【问题讨论】:

  • 为什么你甚至想用递归来做这件事?我用for 循环尝试了这个,它运行了几秒钟......任何不进行尾调用优化的语言都会在这种规模的问题上中断。
  • 嗨,Thomas - 我确实是用 for 循环完成的。我只是好奇是否可以通过递归来做到这一点,因为在其他一些问题上,更容易停止/捕获/修改函数中的计算。

标签: javascript recursion spidermonkey


【解决方案1】:

最大递归级别是 C 源代码中的硬编码值。

如果您获得了源代码(如此处所述:https://developer.mozilla.org/En/SpiderMonkey/Build_Documentation),您可以更改它并编译具有更高价值的新解释器。

打开 js/src/jsinterp.c 并找到包含的行

#define MAX_INLINE_CALL_COUNT 3000

并将最后的值更改为您想要的任何值。密切注意您的内存使用情况,因为过高的值可能会导致您的机器死机(或至少让它变得非常滞后)。

另外,你可能想要编译优化版本(如上页所述),因为当在调试版本中释放内存时,它会用设定值覆盖所有内存以使调试更容易,但它可以非常减慢你的程序(见http://groups.google.com/group/mozilla.dev.tech.js-engine/msg/57934d626c75f7d3)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-31
    • 2016-07-04
    • 2011-02-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 2019-06-23
    • 2016-02-22
    相关资源
    最近更新 更多