![](/img/trans.png)
[英]Trying to find longest string in a list using recursion. Why am I getting none?
[英]Trying to build a list using recursion. Value in global list doesn't change
所以我在做一個問題,並且我使用了遞歸解決方案。 為簡單起見,假設問題是我需要查找給定字符串的所有字謎。 (問題很復雜,但這足以說明我在做什么)。
我正在使用遞歸來做到這一點。
all_anagrams = []
def main():
...
...
get_anagrams() # calls a method that appends anagrams to list all_anagrams
print all_anagrams
方法get_anagrams
是:
def get_anagrams(user_word, anagram, words, inventory):
'''
Finds all anagrams for the given user_word.
'''
if len(inventory) == 0:
all_anagrams.append(anagram)
else:
for choice in words:
if len(choice) <= len(inventory) and choice in inventory:
anagram.append(choice)
inventory.subtract(choice)
get_anagrams(user_word, anagram, words, inventory)
anagram.pop()
inventory.add(choice)
all_anagrams
應該是一個嵌套列表,其中每個子列表都由一些單詞組成。
現在get_anagrams
應該改變的全球價值all_anagrams
但事實並非如此。 在main
,它打印[[], [], [], [], [], []]
,但是在方法內,它打印正確的列表。
請考慮以下示例:
>>> a_list = []
>>> def change_list(some_list):
... some_list.append(1)
... some_list.append(2)
...
>>>
>>> change_list(a_list)
>>> a_list
[1, 2]
我嘗試將列表定義為global
列表,或者將列表作為參數傳遞,因為被調用方對列表所做的任何更改也應反映在調用方中。 但是沒有任何效果。
為什么會這樣呢? 我如何解決它?
實際的問題是append
和pop
。 當你做
all_anagrams.append(anagram)
您正在將對anagram
的引用添加到all_anagrams
。 但是,當遞歸展開時,您將從anagram
中彈出值。 這就是為什么在main
中打印空列表的原因。 立即修復將是這樣
if len(choice) <= len(inventory) and choice in inventory:
inventory.subtract(choice)
get_anagrams(user_word, anagram + [choice], words, inventory)
inventory.add(choice)
正如e-satis所建議的,請避免使用全局變量,而將all_anagrams
作為參數之一傳遞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.