私はこのLeetCodeの問題Palindrome Partitioningの解決方法を見つけようとしています。これは私が現在持っているものです。Pythonの再帰と変数のスコープ
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
を印刷する理由を私は理解していない:out
を返すとき
[['a', 'a', 'a']]
[['a', 'aa'], ['a', 'aa']]
[['aa', 'a'], ['aa', 'a'], ['aa', 'a']]
[['aaa'], ['aaa'], ['aaa'], ['aaa']]
は最後に、空の配列を返すようです。何が起きてる?
再帰後の出力out
は[[], [], [], []]
です。
この
はPython2.7
あなたは同じ 'partition'リストを何度も何度も使用しています。新しいものを作成するたびに新しいものを作成する必要があります。そうしないと、結果配列には同じ 'partition'リストへの参照が4つだけ含まれます。 – spectras
ここで、 "固定"にするには、 'out.append(list(partition))'のようなコピーを作成しなければなりません。 – spectras