加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 尾调用递归

发布时间:2020-12-16 10:20:05 所属栏目:百科 来源:网络整理
导读:我正在实现如下函数: void Add(list* node){ if(this-next == NULL) this-next = node; else this-next-Add(node);} 因为看起来Add会在递归的每一步都被尾调用. 我也可以实现它: void Add(list *node){ list *curr = this; while(curr-next != NULL) curr
我正在实现如下函数:

void Add(list* node)
{
    if(this->next == NULL)
        this->next = node;
    else
        this->next->Add(node);
}

因为看起来Add会在递归的每一步都被尾调用.
我也可以实现它:

void Add(list *node)
{
    list *curr = this;
    while(curr->next != NULL) curr = curr->next;
    curr->next = node;
}

这根本不会使用递归.
哪个版本更好? (堆栈大小或速度)
请不要给出“为什么不使用STL / Boost /其他?”意见/答案.

解决方法

它们可能在性能上是相同的,因为编译器可能会将它们优化为完全相同的代码.

但是,如果在Debug设置上进行编译,编译器将不会针对尾部递归进行优化,因此如果列表足够长,则可能会出现堆栈溢出.还有(非常小的)可能性,错误的编译器不会优化尾递归的递归版本.在迭代版本中没有风险.

选择哪一个更清晰,更容易保持考虑非优化的可能性.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读