3

我目前正在使用 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);

谢谢你的帮助。

4

1 回答 1

5

最大递归级别是 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)。

于 2010-01-20T23:04:38.343 回答