[英]Recursion in python and global variables
我正在 leetcode 上进行 n 叉树前序遍历。
我有使用两种方法的解决方案:
"""
# Definition for a Node.
class Node(object):
def __init__(self, val=None, children=None):
self.val = val
self.children = children
"""
class Solution(object):
def preorder(self, root):
output = []
self.recur(root, output)
return output
def recur(self, root, output):
if not root:
return []
output.append(root.val)
for x in root.children:
self.recur(x, output)
我想知道如何使用一种方法进行相同的递归。 下面的解决方案给我带来了问题。 即,当 leetcode 运行测试用例时,它聚合 output。即测试用例 #2 的 output 数组附加到测试用例 #1 的输出数组。
所以:Testcase 1 output = [Test 1 solution] Testcase 2 output = [Test 1 solution, Test Case 2 solution]
test = []
class Solution(object):
def preorder(self, root):
"""
:type root: Node
:rtype: List[int]
"""
if not root:
return []
test.append(root.val)
for x in root.children:
self.preorder(x)
return test
您可能不应该将全局变量用作此 leetcode 挑战的一部分,因为 leetcode 可能会为每个测试用例创建一个新的 class Solution
实例。 解决此问题的最简单方法是创建一个 class 构造函数来初始化您的列表。 这将删除导致您提到的问题的全局变量。
class Solution(object):
def __init__(self):
self.test = []
def preorder(self, root):
"""
:type root: Node
:rtype: List[int]
"""
if not root:
return self.test
self.test.append(root.val)
for x in root.children:
self.preorder(x)
return self.test
与其将output
列表移动为全局变量或实例变量,不如将其设为具有默认值的参数,这样您就可以直接调用 function 的递归版本。您不想直接初始化为空列表但是,默认情况下,函数和方法的 arguments 仅在 function 编译时创建一次。 然后,相同的 object 将重复用于不包含该参数值的每个调用。 对于像列表这样的可变 object,这并不好(实际上,它基本上是全局列表的另一个版本)。
相反,使用一个哨兵值,比如None
来指示何时没有传递任何东西,并在方法的主体中检查它:
class Solution(object):
def preorder(self, root: Node, output: Optional[list]=None) -> list:
if output is None:
output = []
if root is not None:
output.append(root.val)
for x in root.children:
self.preorder(x, output)
return output
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.