3

私は現在、JavaScriptを使用したProjectEulerの問題に取り組んでいます。ほとんどの場合、私はforループを使用して問題を反復処理してきましたが、再帰関数を使用したいと考えていました。ただし、すべてのJavaScriptエンジンには、処理できる再帰の量に制限があるようです。

シェルから実行するためにSpiderMonkeyをコンパイル/インストールしましたが、それでも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 に答える