繁体   English   中英

递归python和全局变量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM