c++ - 尾递归是否需要 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
,因为没有它,它将“不再是函数所做的最后一件事”。
解决方案
特别是在 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。
推荐阅读
- jquery - 从 hive 中的表中提取列会导致 NULL 表
- c - 如何让它将 -1 注册为退出并将编号列表显示为从 1 开始?
- php - csv export Call to a member function fetch() on array
- python - 获取用于抓取 GoodReads.com url 的简单 python 脚本的 Traceback 错误
- css - CSS variables defaults: set if not already set
- reactjs - 有没有办法在 iOS Instagram 应用内浏览器中测试我的网站?
- python - 有没有办法使用用户输入将键值从另一个字典添加到字典
- python - Django“未配置设置”错误,无法定义环境变量 DJANGO_SETTINGS_MODULE
- python - 给定布尔索引,重新调整 numpy 数组中的列
- vba - 如何在文本框上设置焦点?