Goruyorum ki bu aralar kombinasyon/permutasyon/secilim sorulari baya ragbet goruyor. Kimilerine tek satirlik recursive lambda olarak verdigim cevaplar da ilgi cekiyor. O zaman basitlerinden bir tanesini egzersiz olarak yapalim: Listenin permutasyonlari.
Evet, itertools.permutations
'in tek parametreli versiyonunu yaziyoruz:
>>> list(per("abcd"))
[('a', 'b', 'c', 'd'), ('a', 'b', 'd', 'c'), ('a', 'c', 'b', 'd'), ('a', 'c', 'd', 'b'), ('a', 'd', 'b', 'c'), ('a', 'd', 'c', 'b'), ('b', 'a', 'c', 'd'), ('b', 'a', 'd', 'c'), ('b', 'c', 'a', 'd'), ('b', 'c', 'd', 'a'), ('b', 'd', 'a', 'c'), ('b', 'd', 'c', 'a'), ('c', 'a', 'b', 'd'), ('c', 'a', 'd', 'b'), ('c', 'b', 'a', 'd'), ('c', 'b', 'd', 'a'), ('c', 'd', 'a', 'b'), ('c', 'd', 'b', 'a'), ('d', 'a', 'b', 'c'), ('d', 'a', 'c', 'b'), ('d', 'b', 'a', 'c'), ('d', 'b', 'c', 'a'), ('d', 'c', 'a', 'b'), ('d', 'c', 'b', 'a')]
Hatta Python’da yazarsaniz sunlari test case olarak kullanabilirsiniz:
import itertools
assert sorted(per([])) == sorted(itertools.permutations([]))
assert sorted(per([1,2])) == sorted(itertools.permutations([1,2]))
assert sorted(per(['x','y','z'])) == sorted(itertools.permutations(['x','y','z']))
assert sorted(per("ABCD")) == sorted(itertools.permutations("ABCD"))
assert sorted(per([1,2,3,4,5])) == sorted(itertools.permutations([1,2,3,4,5]))
Recursive (ozyinelemeli) fonksiyonlari anlamak, yazabilmek isteyenler var. O zaman:
Bonus 1: Loop, yani for
veya while
kullanmadan yazin. (*list comprehension icindeki for
kullanilabilir ama sart veya gerekli degil.)
Bonus 2: Degisken kullanmadan yazin. (Parametreler, for x in xs
'deki x
filan kullanilabilir. Tekrari onlemek icin x = uzun_cagri(y, z, w)
bile tamam. Bilgi biriktiren, yeni degerini eskisinden alan degisken istemiyoruz: x = x + 1
veya x.append(...)
gibi.)