【发布时间】:2013-11-30 11:00:12
【问题描述】:
我在考虑递归函数。举一个简单的函数,比如递归打印一个链表:
void print(list *list){
if(list){
cout << list->data
print(list->next);
}
}
起初这似乎是一个非常无害的函数,但它不是在每个堆栈帧中存储一个地址(由变量列表标记)吗?假设没有尾调用优化。我们需要 N 个地址的空间,其中 N 是列表的大小。所需空间与列表大小成正比线性增长。
如果没有至少一个局部变量或参数存储在堆栈上,我想不出你将如何实现递归函数。因此,似乎每个递归函数都将具有最好的线性空间复杂度。如果是这种情况,那么使用迭代而不是递归不是几乎总是可取的吗?
【问题讨论】:
-
编译器 could trivially optimize this 不会在堆栈中保留任何内容。
-
@DavidSchwartz:当然,但是 OP 在中间段落中声明,“假设没有尾调用优化”。
标签: c++ c algorithm recursion big-o