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 回答