SORU
29 EKİM 2008, ÇARŞAMBA


Python: bir jeneratör olarak özyinelemeli bir algoritma kullanarak

Son zamanlarda saçma kısıtlamaları ile belirli dizileri oluşturmak için bir fonksiyon yazdım. Sorun doğal özyinelemeli bir çözüm ile geldi. Tesadüfe bakın ki, hatta nispeten küçük giriş, dizisi binlerce, böylece tercih ederim kullanın benim algoritma olarak bir jeneratör kullanmak yerine, onu doldurmak için bir liste ile tüm dizileri.

İşte bir örnek. Özyinelemeli fonksiyon ile bir string tüm permütasyon hesaplamak istiyoruz diyelim. Aşağıdaki naif algoritma ekstra bir argüman alır 'depolama' ve ekler bulur zaman: bir permütasyon

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

(Lütfen verimsizlik umurumda değil, bu sadece bir örnektir.)

Şimdi bir jeneratör görevim çevirmek istiyorum, yani bir permütasyon verim yerine depolama listesine ekleme:

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

Bu kod yokdeğilçalışma (fonksiyon boş bir jeneratör gibi davranır).

Bir şey mi kaçırdım? Bir jeneratör yukarıdaki özyineli algoritma açmaktırbir yinelemeli bir değiştirme olmadan?

CEVAP
29 EKİM 2008, ÇARŞAMBA


def getPermutations(string, prefix=""):
    if len(string) == 1:
        yield prefix   string
    else:
        for i in xrange(len(string)):
            for perm in getPermutations(string[:i]   string[i 1:], prefix string[i]):
                yield perm

Ya da olmayan bir standart

def getPermutations(string):
    if len(string) == 1:
        yield string
    else:
        for i in xrange(len(string)):
            for perm in getPermutations(string[:i]   string[i 1:]):
                yield string[i]   perm

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 30GB

    30GB

    14 AĞUSTOS 2006
  • Chuck Testa

    Chuck Testa

    14 AĞUSTOS 2011
  • mobilenet.cz

    mobilenet.cz

    26 NİSAN 2008