首页 > 解决方案 > 尾递归是否需要 return 关键字?

问题描述

我们在学校学习递归。

根据我在网上阅读的内容,您可以通过将递归步骤作为函数执行的最后一件事来优化递归函数。

但是需要 return 关键字吗?即使是 void 函数?

void insert(Node<T>*& n, T value) 
{
    if (n == nullptr)
    {
        n = new Node<T>(value);
        return;
    }
    else if (value < n->get_value())
    {
        Node<T>* left = n->get_left();
        return insert(left, value);
    }
    else
    {
        Node<T>* right = n->get_right();
        return insert(right, value);
    }
}

如果没有 return 关键字,这仍然是尾递归吗?
特别是在 中else if,因为没有它,它将“不再是函数所做的最后一件事”。

标签: c++recursion

解决方案


特别是在 else if 中,因为没有它,它将“不再是函数所做的最后一件事”。

那不是真的。

在除 when 之外的所有情况下insert,调用都是该函数所做的最后一件事。n == nullptr

添加冗余return语句不会改变这一点。

这个:

void bar() {}

void foo()
{
    return bar();
}

相当于这个:

void bar() {}

void foo()
{
   bar();
   return;
}

或这个:

void bar() {}

void foo()
{
   bar();
}

绝对在各个方面。

事实上,我们被允许这样做的唯一原因,在一个返回的函数中void(记住,你实际上并没有在这里返回任何值!),是为了让实现模板更容易一些。

而且,在所有这些示例中,编译器不需要为调用bar(). 在递归函数的情况下,这给了你tail recursion


推荐阅读