【问题标题】:Python recursion and scope of variablePython递归和变量范围
【发布时间】:2016-05-23 13:48:11
【问题描述】:

我正在尝试找出解决这个 LeetCode 问题Palindrome Partitioning 的方法。这是我目前拥有的:

def partition(s):
    out = []
    def isPalindrome(word):
        return word == word[::-1]

    def addPalindrome(word, start, partition):
        if start == len(word):
            out.append(partition)  #where I append to 'out'
            print out, partition  # where I print the finished partition
            return
        for i in range(start+1, len(word)+1):
            sub = word[start:i]
            if isPalindrome(sub):
                partition.append(sub)
                addPalindrome(word, i, partition)
                partition.pop()

    if not s:
        return []
    addPalindrome(s, 0, [])
    return out

print partition('aaa')

输入“aaa”的正确解是[['a', 'a', 'a'], ['a', 'aa'], ['aa', 'a'], ['aaa']]。当我在基本情况下打印partition 时,它似乎是正确的。我将它们附加到一个 out 变量,该变量应该超出递归范围并正确返回。

然而事实并非如此。我不明白为什么在基本情况下打印 out 会导致:

[['a', 'a', 'a']]
[['a', 'aa'], ['a', 'aa']]
[['aa', 'a'], ['aa', 'a'], ['aa', 'a']]
[['aaa'], ['aaa'], ['aaa'], ['aaa']]

最后返回out时,似乎返回了空数组。这是怎么回事?

out递归后的输出为[[], [], [], []]

这是 Python2.7

【问题讨论】:

  • 您一次又一次地使用相同的partition 列表。每次想要一个新的时都必须创建一个新的,否则您的结果数组只包含对同一 partition 列表的 4 个引用。
  • 这里,如果你想让它“固定”,你必须创建一个副本,比如out.append(list(partition))

标签: python recursion reference


【解决方案1】:

我看到的问题是 1) 记住在保存时复制(如 cmets 中所述)和 2) 使用全局来保存不断增长的结果,而不是在递归中处理它。让我们简化代码并解决这两个问题:

def isPalindrome(word):
    return word == word[::-1]

def addPalindrome(word, start, partitions):
    result = []

    if start == len(word):
        result.append(list(partitions))  # where I append to 'out'
    else:
        for i in range(start+1, len(word)+1):
            sub = word[start:i]

            if isPalindrome(sub):
                partitions.append(sub)
                result.extend(addPalindrome(word, i, partitions))
                partitions.pop()
    return result

def partition(s):
    out = []

    if s:
        out = addPalindrome(s, 0, [])

    return out

print partition('aaa')

在递归中处理结果时,而不是作为全局处理,关键是知道何时将结果传递给*.append() 以及何时传递给*.extend()

【讨论】:

    猜你喜欢
    • 2021-07-15
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 2017-09-30
    • 2017-04-08
    • 2017-12-08
    • 2015-10-13
    • 2011-08-24
    相关资源
    最近更新 更多