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; } 这根本不会使用递归. 解决方法
它们可能在性能上是相同的,因为编译器可能会将它们优化为完全相同的代码.
但是,如果在Debug设置上进行编译,编译器将不会针对尾部递归进行优化,因此如果列表足够长,则可能会出现堆栈溢出.还有(非常小的)可能性,错误的编译器不会优化尾递归的递归版本.在迭代版本中没有风险. 选择哪一个更清晰,更容易保持考虑非优化的可能性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |