最近我寫了一個函數來生成具有非平凡約束的特定序列。問題出現在自然遞歸解決方案中。現在碰巧,即使是相對較小的輸入,序列也有數千個,因此我寧願將我的算法用作生成器,而不是用它來填充所有序列的列表。Python:使用遞歸算法作爲生成器
這裏是一個例子。假設我們想用遞歸函數計算一個字符串的所有排列。下面天真的算法需要一個額外的參數「存儲設備」,並追加置換到它時,它發現一個:
def getPermutations(string, storage, prefix=""):
if len(string) == 1:
storage.append(prefix + string) # <-----
else:
for i in range(len(string)):
getPermutations(string[:i]+string[i+1:], storage, prefix+string[i])
storage = []
getPermutations("abcd", storage)
for permutation in storage: print permutation
(請不要在意效率低下,這只是一個例子)
現在我希望把我的職能轉變爲發電機,即產生的,而不是將其追加到存儲列表中的排列:
def getPermutations(string, prefix=""):
if len(string) == 1:
yield prefix + string # <-----
else:
for i in range(len(string)):
getPermutations(string[:i]+string[i+1:], prefix+string[i])
for permutation in getPermutations("abcd"):
print permutation
此代碼不工作(該函數的行爲像一個空發生器)。
我錯過了什麼嗎? 有沒有辦法將上面的遞歸算法變成一個生成器而不用迭代器代替它?
在Python 3.4,可以更換的最後兩行用`產量從getPermutations( string [:i] + string [i + 1:])`,這在很多方面都更加高效! – 2014-04-29 17:46:30