是否有可能增加SpiderMonkey中的递归限制?

问题描述:

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

我编译/安装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); 

感谢您的帮助。

+0

为什么你甚至想用递归来做到这一点?我用'for'循环试了这个,并且它运行了几秒钟......任何不执行tail-call优化的语言都会在这个大小的问题上崩溃。 – Thomas 2010-01-20 21:15:58

+0

嗨托马斯 - 我做了一个for循环。我只是好奇,如果有可能使用递归做到这一点,因为在一些其他的问题也就更容易停止/捕获/修改函数中的计算。 – 2010-01-20 21:51:57

最大递归水平是在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)。

+0

非常丰富,谢谢! – 2010-01-21 02:58:51