C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 尾调用递归大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在实现如下函数

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

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

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

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

解决方法

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

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

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

大佬总结

以上是大佬教程为你收集整理的c – 尾调用递归全部内容,希望文章能够帮你解决c – 尾调用递归所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。