【发布时间】:2017-05-14 19:37:28
【问题描述】:
我有一个递归函数,我想让它成为尾递归的。我的实际问题更复杂且取决于上下文。但我想解决的问题是用这个简单的程序演示的:
#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 也不这样做
-
你希望这个尾递归如何终止?
-
您能否详细说明“每次都必须调用
obj n的析构函数”是什么意思?每个obj n将在堆栈从您的递归基本案例(目前不存在)展开时被破坏。您希望何时/如何调用析构函数? -
@SamVarshavchik 我没有。尾递归的一个常见测试是检查堆栈溢出(错误,而不是这个站点:))这就是我这样设计它的原因
标签: c++ recursion tail-recursion