这是我编写的一个小函数,用于检查整数是否为素数:
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,则会发生堆栈溢出错误并且代码中断。现在,这个函数不是尾递归吗?如果是这样,那么不应该为递归调用维护堆栈,并且不应该发生溢出?
我到底该怎么做?
答案 0 :(得分:1)
它是一个尾递归函数,但不要求任何编译器优化尾递归到循环中。如果你已经将优化级别设置得足够高,那么很可能会这样做。但就是这样。
LISP(和派生语言)是我所知道的唯一一个尾递归实际上是实现的要求。