这不是尾递归吗? (堆栈溢出错误)

时间:2013-06-19 16:07:44

标签: c++ c visual-c++ recursion tail-recursion

这是我编写的一个小函数,用于检查整数是否为素数:

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,则会发生堆栈溢出错误并且代码中断。现在,这个函数不是尾递归吗?如果是这样,那么不应该为递归调用维护堆栈,并且不应该发生溢出?

我到底该怎么做?

1 个答案:

答案 0 :(得分:1)

它是一个尾递归函数,但不要求任何编译器优化尾递归到循环中。如果你已经将优化级别设置得足够高,那么很可能会这样做。但就是这样。

LISP(和派生语言)是我所知道的唯一一个尾递归实际上是实现的要求。