我有一个递归函数,我想做尾递归。我的实际问题更复杂并且与上下文有关。但我想解决的问题是用这个简单的程序来演示的:对象的尾递归
#include <iostream>
struct obj
{
int n;
operator int&() { return n; }
};
int tail(obj n)
{
return tail(obj{ n + 1 > 1000 ? n - 1000 : n + 1 });
}
int main()
{
tail(obj{ 1 });
}
这似乎是自然的,这是尾递归。但它不是,因为每次都需要调用obj n
的析构函数。至少MSVC13(编辑:) 和MSVC15不会优化此。如果我用int替换obj
并相应地更改调用,它将按预期变为尾递归。
我的实际问题是:是否有一种简单的方法可以将这个尾递归分开,只需将obj
替换为int
?我的目标是获得性能优势,因此使用堆分配内存和new
最有可能没有帮助。
最简单的方法:获得更好的编译器,无论如何你已经过时了...... –
msvc15不会这样做,要么 – IceFire
你如何期待这个尾递归终止? –