为什么一个解决方案在两种情况下具有相同的时间复杂度但迭代的空间复杂度更高时,应该选择递归而不是迭代?
答案 0 :(得分:1)
这是一个特殊的例子,其中有一些额外的考虑因素。树搜索算法可以递归地定义(因为树的每个子树是树)或迭代地(具有堆栈)。但是,虽然递归搜索可以完美地用于查找具有特定属性的第一个叶子或搜索所有叶子,但它不适合生成行为良好的迭代器:返回叶子的对象或函数状态,以及稍后在迭代设计中,搜索堆栈可以存储为对象或函数的静态成员,但在递归设计中,只要函数返回,调用堆栈就会丢失,并且重新创建很困难或者很昂贵
答案 1 :(得分:0)
在某些算法中,迭代更难以理解。如果迭代地表达,则可以自然地递归表达的算法可能不那么容易理解。将递归算法转换为迭代算法也很困难,并且验证算法是否等效也很困难。
递归允许您在每个函数调用时分配其他自动对象。迭代替代方案是重复动态分配或调整存储器块的大小。在许多平台上,自动分配要快得多,以至于其速度加成超过了递归调用的速度惩罚和存储成本。 (但是如上所述,某些平台不支持分配大量自动数据;这是一种权衡。)
当迭代解决方案要求您使用堆栈模拟递归时,递归非常有用。递归确认编译器已经管理堆栈以完全满足您的需求。当您开始管理自己的时,您不仅可能重新引入您打算避免的函数调用开销;但是你正在重新发明一个轮子(有足够的空间来容纳bug)已经存在于一个非常无错误的形式。