考虑尾部递归的示例
int foo(vector<int> &vec, int n)
{
if (n == 1) return vec[0];
vector<int> new_vector = createNewVector(vec);
return foo(new_vector, n-1);
}
其中createNewVector(vec)
是任何返回与vec
相同大小的新向量的函数。
我担心编译器无法将其检测为尾递归,因为vec
是通过引用传递的(不能删除先前的堆栈帧,因为vec
指向先前的new_vector
的引用点) 。在那种情况下,用于此递归的内存将是O(n*vec.size())
,因为每个先前的堆栈帧都包含vec.size()
元素。
这是真的,还是可以将此函数优化为尾部递归?
答案 0 :(得分:4)
尾递归(TCO)是不可能的。从循环调用返回后必须调用new_vector
析构函数,这完全消除了TCO的可能性。
通常,当非平凡类型的自动变量在起作用时,自动对象的析构函数使编译器很难参与TCO,并且在示例中按值或引用传递向量不会产生任何影响-总体拥有成本仍然没有发生。