Son zamanlarda, önemsiz kısıtlamalarla belirli diziler oluşturmak için bir fonksiyon yazdım. Sorun, doğal bir özyinelemeli çözümle geldi. Şimdi, nispeten küçük girdiler için bile, diziler birkaç bin oluyor, bu yüzden algoritmamı tüm dizilerle bir listeyi doldurmak için kullanmak yerine bir üretici olarak kullanmayı tercih ederim.
İşte burada. Bir örnek. Bir dizgenin tüm permütasyonlarını özyinelemeli bir işlevle hesaplamak istediğimizi varsayalım. Aşağıdaki saf algoritma fazladan bir "storage" bağımsız değişkeni alır ve bulduğunda ona bir permütasyon ekler:
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:], depolama , prefix+string[i]) depolama = [] depolamada permütasyon için getPermutations("abcd", depolama): print permütasyon
(Lütfen verimsizliği önemsemeyin, bu sadece bir örnek.)
Şimdi işlevimi bir oluşturucuya dönüştürmek istiyorum, yani onu depolama listesine eklemek yerine bir permütasyon sağlamak için:
def getPermutations(string , prefix=""): if len(string) == 1: verim öneki + string # <----- else: for i in range(len(string)): getPermutations(string[:i]+string getPermutations("abcd") içindeki permütasyon için [i+1:], önek+dize[i]): baskı permütasyonu
Bu kod çalışmıyor ( fonksiyon em gibi davranır pty üreteci).
Bir şeyi mi kaçırıyorum? Yukarıdaki özyinelemeli algoritmayı yinelemeli bir algoritmayla değiştirmeden bir oluşturucuya dönüştürmenin bir yolu var mı?