我最近在学习日期结构。 在Mark Allen Weiss的书中,C语言中的数据结构和算法分析,为什么他说尾递归是一种错误的递归使用,最好不要在第3章中使用它?但我看到很多人说它在网上很有用。
答案 0 :(得分:5)
这不一定是坏事。尾递归总是等效于循环,显式写循环可能更有效,具体取决于编译器。(*)现代编译器(如GCC)可以优化尾递归,但它们并不总能识别它。当他们没有看到它时,递归会占用堆栈空间。
也就是说,诸如quicksort之类的算法自然地递归地表达,并且其两个递归中的一个是尾递归。我会在第一次传递时递归写入它,然后如果我发现它太慢就会将其重写为循环。
当一个算法只有一个尾递归的递归时,将它直接写成循环可能仍然是一个好主意,因为递归函数比循环更难调试。
(*)我假设我们只谈论C。在其他一些语言中,尾递归可以被认为是循环的自然方式(函数语言)或完全可憎的(Python)。
答案 1 :(得分:4)
尾递归很好,是一种非常有用的结构代码技术。这不是“坏事”。但是,有一些警告:
与任何递归一样,除非你的编译器能够优化它(检查这个),它将消耗堆栈帧。对于大输入,这可能会导致堆栈溢出。
一些程序员对递归有一种幼稚的反感,并且知道尾递归总是可以转换为循环,相信它总是应该。
由于上述两个原因,您应该学习如何在尾递归和循环之间进行转换,这不仅仅是因为它可以帮助您了解编译器是否可以优化递归。