通过引用传递的向量的尾递归

时间:2018-08-13 15:18:36

标签: c++ recursion pass-by-reference tail-recursion

考虑尾部递归的示例

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()元素。

这是真的,还是可以将此函数优化为尾部递归?

1 个答案:

答案 0 :(得分:4)

在这种情况下,

尾递归(TCO)是不可能的。从循环调用返回后必须调用new_vector析构函数,这完全消除了TCO的可能性。

通常,当非平凡类型的自动变量在起作用时,自动对象的析构函数使编译器很难参与TCO,并且在示例中按值或引用传递向量不会产生任何影响-总体拥有成本仍然没有发生。