python 3中使用堆栈的递归与迭代

Posted

技术标签:

【中文标题】python 3中使用堆栈的递归与迭代【英文标题】:Recursion versus Iteration using stack in python 3 【发布时间】:2021-11-17 09:52:51 【问题描述】:

在内存使用方面(或总体而言)哪个更好?

    使用递归并具有堆栈实现(操作系统隐式) 使用迭代并具有堆栈实现(显式)

Leetcode 上名为1265. Print Immutable Linked List in Reverse 的问题的示例代码如下。

class Solution:
    """Recursion"""

    def printLinkedListInReverse(self, head: "ImmutableListNode") -> None:
        if head:
            self.printLinkedListInReverse(head.getNext())
            head.printValue()


class Solution:
    """Iteration"""

    def printLinkedListInReverse(self, head: "ImmutableListNode") -> None:
        stack = []
        while head:
            stack.append(head)
            head = head.getNext()
        while stack:
            stack.pop().printValue()

请在内存使用方面对比上述代码。

【问题讨论】:

【参考方案1】:

通常,递归比迭代占用更多内存。参见示例

https://webrewrite.com/iteration-versus-recursion-which-one-you-choose

对于大型数据集,我总是使用迭代。

【讨论】:

【参考方案2】:

代码的递归版本占用更多内存,因为它至少会堆叠局部变量(其中有两个:selfhead)和返回地址(调用后应继续执行的位置) )。

在您的代码的迭代版本中,显式堆栈只有head 的引用。

如果函数不是Solution方法,情况会有所改善,但这是 LeetCode 测试框架的核心模式。

另一个考虑是调用堆栈的大小是有限的。所以如果输入很大,那么递归版本不是一个选项。

现在,这并没有说明程序的速度。可能仍然是递归版本运行得更快,这取决于解释器。

【讨论】:

我认为递归不仅要跟踪两个局部变量,还要跟踪函数的名称、执行流程等。 请随时发布您的答案,@stef。 但是我的回答基本上和你的一样,除了我会在“因为它堆叠局部变量并且其中有两个”之后添加半句。您的答案最重要的一点是“当您编写自己的堆栈而不是使用递归时,您可以选择要保留在内存中的内容”,我没有其他要添加的内容。

以上是关于python 3中使用堆栈的递归与迭代的主要内容,如果未能解决你的问题,请参考以下文章

将带有全局变量的递归转换为使用堆栈的迭代

Python递归限制与堆栈大小?

python 数据结构 理解迭代与递归 递归的实例 栈帧 函数调用

递归与回溯:python列表组合问题

python-迭代和递归

Scheme中的递归和调用堆栈