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】:代码的递归版本占用更多内存,因为它至少会堆叠局部变量(其中有两个:self
和 head
)和返回地址(调用后应继续执行的位置) )。
在您的代码的迭代版本中,显式堆栈只有head
的引用。
如果函数不是Solution
的方法,情况会有所改善,但这是 LeetCode 测试框架的核心模式。
另一个考虑是调用堆栈的大小是有限的。所以如果输入很大,那么递归版本不是一个选项。
现在,这并没有说明程序的速度。可能仍然是递归版本运行得更快,这取决于解释器。
【讨论】:
我认为递归不仅要跟踪两个局部变量,还要跟踪函数的名称、执行流程等。 请随时发布您的答案,@stef。 但是我的回答基本上和你的一样,除了我会在“因为它堆叠局部变量并且其中有两个”之后添加半句。您的答案最重要的一点是“当您编写自己的堆栈而不是使用递归时,您可以选择要保留在内存中的内容”,我没有其他要添加的内容。以上是关于python 3中使用堆栈的递归与迭代的主要内容,如果未能解决你的问题,请参考以下文章