我在思考递归函数。以一个简单的函数为例,比如递归打印链表:
void print(list *list){
if(list){
cout << list->data
print(list->next);
}
}
起初,这个函数似乎相当无害,但是它不是在每个堆栈帧中存储一个地址(由变量列表标记)吗?假设没有尾调用优化。我们需要N个地址的空间,其中N是列表的大小。所需的空间与列表的大小成比例线性增长。
我想不出如何在没有至少一个本地变量或参数存储在堆栈上的情况下实现递归函数。因此,似乎每个递归函数最多都具有线性空间复杂度。如果是这种情况,那么使用迭代而不是递归几乎总是明智的选择。