2010-01-20 54 views
2

我目前正在對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

回答

4

最大遞歸水平是在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

相關問題