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

Algorithm 应该选择递归而不是迭代?,algorithm,Algorithm,当一个解在两种情况下具有相同的时间复杂度,但在迭代中具有更好的空间复杂度时,为什么要选择递归而不是迭代呢?在某些算法中,迭代更难理解。一个可以自然地递归表达的算法,如果以迭代方式表达,可能就不那么容易理解。将递归算法转换为迭代算法也很困难,验证算法是否等效也很困难 递归允许您在每次函数调用时分配额外的自动对象。迭代的替代方法是重复地动态分配或调整内存块的大小。在许多平台上,自动分配要快得多,以至于它的速度加成超过了递归调用的速度损失和存储成本。(但如上所述,一些平台不支持分配大量自动数据;这是一

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

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

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


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

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

您需要了解尾部递归。并不是所有的递归算法都会有更糟糕的空间复杂度。当您只需要一个小的递归定义时,为什么要使用太多的hueristics呢