应该选择递归而不是迭代?

Posted

技术标签:

【中文标题】应该选择递归而不是迭代?【英文标题】:One should choose recursion over iteration? 【发布时间】:2017-12-07 23:51:50 【问题描述】:

当解决方案在两种情况下具有相同的时间复杂度但迭代的空间复杂度更高时,为什么要选择递归而不是迭代?

【问题讨论】:

你需要了解尾递归。并不是所有的递归算法都会有更差的空间复杂度。 显然是递归。当你可以简单地有小的递归定义时,你为什么要进行太多的启发式分析 【参考方案1】:

递归的一些好处

代码非常优雅(与循环相比)

在回溯数据结构(如 LinkedList、二叉搜索树)中非常有用,因为递归通过调用自身以及专门为此递归调用和每个调用链接到其前一个调用的堆栈来工作

【讨论】:

【参考方案2】:

这是一个需要额外考虑的特殊示例。树搜索算法可以递归定义(因为树的每个子树都是一棵树)或迭代定义(使用堆栈)。然而,虽然递归搜索可以完美地找到具有特定属性的第一个叶子或搜索所有叶子,但它并不适合生成行为良好的迭代器:返回叶子的对象或函数状态,稍后当再次调用返回下一个叶子,依此类推。在迭代设计中,搜索堆栈可以存储为对象或函数的静态成员,但在递归设计中,只要函数返回,调用堆栈就会丢失并且重新创建困难或昂贵.

【讨论】:

【参考方案3】:

迭代在某些算法中更难理解。一个可以自然递归表达的算法,如果迭代表达,可能就不那么容易理解了。将递归算法转换为迭代算法也很困难,验证算法是否等价也很困难。

递归允许您在每次函数调用时分配额外的自动对象。迭代的替代方法是重复动态分配或调整内存块的大小。在许多平台上,自动分配要快得多,以至于它的速度加成超过了递归调用的速度损失和存储成本。 (但有些平台不支持分配大量自动数据,如上所述;这是一种权衡。)

当迭代解决方案要求您使用堆栈模拟递归时,递归非常有用。递归承认编译器已经管理了一个堆栈来精确地完成你所需要的。当您开始自己管理时,您不仅可能会重新引入您打算避免的函数调用开销;但是您正在重新发明一个已经以完全没有错误的形式存在的***(有足够的错误空间)。

【讨论】:

以上是关于应该选择递归而不是迭代?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决“迭代器应该返回字符串,而不是字节”

将分而治之的递归算法转换为迭代版本

csv.Error:迭代器应该返回字符串,而不是字节

python-day5-生成器迭代器及递归调用

Python 是不是具有用于一阶递归关系的迭代递归生成器函数?

递归和迭代