algorithm - 为什么尾递归是对递归的错误使用?

标签 algorithm data-structures recursion tail-recursion

最近在学习Date结构。 在 Mark Allen Weiss 的书中,Data structures and Algorithm Analysis in C,为什么他说尾递归是对递归的错误使用,最好不要在第 3 章中使用它?但是网上看到很多人说有用。

最佳答案

不一定是坏事。尾递归始终等同于循环,显式编写循环可以更高效,具体取决于编译器。(*) GCC 等现代编译器可以优化尾递归,但它们并不总是能识别它。当他们看不到它时,递归将消耗堆栈空间。

也就是说,像快速排序这样的算法自然是递归表示的,它的两个递归之一是尾递归。我会在第一遍递归地编写它,如果我发现它太慢了,然后将其重写为一个循环。

当算法只有一个递归(尾递归)时,立即将其编写为循环可能仍然是个好主意,因为递归函数比循环更难调试。

(*) 我假设我们只讨论 C。在其他一些语言中,尾递归要么被认为是循环的自然方式(函数式语言),要么被认为是一种完全令人厌恶的方式(Python)。

关于algorithm - 为什么尾递归是对递归的错误使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18723336/

相关文章:

algorithm - 随机快速排序最坏情况时间复杂度

算法效率分析

algorithm - 在没有计算机的情况下可视化和求解递归方程

algorithm - 区间树遍历

algorithm - 给定一个递增多项式,如何有效地找到 y 的固定间隔内的 x 值?

Java 单个 LinkedList 添加复杂度为 O(1)

python - 嵌套列表的非递归遍历——在Python中构建一个类似的嵌套列表

recursion - 方案 - foo(x y) 没有调用递归调用

c# - 查找不是父/祖 parent /等或子/孙/等的所有链接对象的算法

c - 如何随机打乱 C 中的链表