2

これは、整数が素数かどうかをチェックするために私が書いた小さな関数です。

int prime(int x, int y = 2)
{
    if(y <= x/2)
    {
        if((x % y) == 0)
            return 0;
    }
    else
        return 1;

    return prime(x, ++y);
}

今、Visual Studio 2012 でコンパイルして、105943 のような大きな値を指定すると、スタック オーバーフロー エラーが発生し、コードが壊れます。さて、この関数は末尾再帰ではありませんか? もしそうなら、再帰呼び出しのためにスタックを維持するべきではなく、オーバーフローが発生するべきではありませんか?

ここに正確に到達していないのは何ですか?

4

1 に答える 1

1

これは末尾再帰関数ですが、コンパイラが末尾再帰をループに最適化する必要はありません。最適化レベルを十分に高く設定していれば、そうなる可能性があります。しかし、それだけです。

LISP (および派生言語) は、末尾再帰が実際に実装の要件であると私が知っている唯一のものです。

于 2013-06-19T16:55:33.603 に答える