Birincisi basamak sayısı, ikincisi ise atabileceğimiz farklı adim sayısı olmal üzere iki argüman alan, bu argümanlara göre merdiveni çıkma kombinasyonlarını veren bir fonksiyon yazmak istiyorum.
def olasiliklar(tbs: int = 0, ab: list = []):
"""
:param tbs: toplam basamak sayısı
:param ab: atılacak basamaklar
"""
sonuc = []
duzenli_adimlar = [
_ for _ in ab for __ in range(1, tbs + 1, _)
]
gtbs = tbs # geçici toplam basamak sayısı
while gtbs:
for i in __import__("itertools").permutations(duzenli_adimlar, gtbs):
if sum(i) == tbs and i not in sonuc:
sonuc.append(i)
gtbs -= 1
return sonuc
for olasilik in olasiliklar(tbs=4, ab=[1, 2]):
print(olasilik)
subset_sum_rep = lambda sum_, es: [] if sum_ < 0 else [[]] if sum_ == 0 else [[e] + ss for e in es for ss in subset_sum_rep(sum_ - e, es)]
adim_komb = lambda s, es: "\n".join(map(str, subset_sum_rep(s, es)))
Ben de okunabilen, yazilabilen, anlasilabilen kodu tavsiye ediyorum, her hangisiyse.
Recursion icin guzel ornek aslinda. Haskell’de base case’ler guard olarak yazilabiliyor, daha da guzel:
subset_sum_rep :: Int -> [Int] -> [[Int]]
subset_sum_rep sum es | sum < 0 = []
| sum == 0 = [[]]
| otherwise = concatMap (\e -> map (e:) (subset_sum_rep (sum - e) es)) es
adim_komb sum es = concatMap ((++"\n") . show) (subset_sum_rep sum es)
Benim tavsiyem Python kodunu Haskell gibi base case | base case | recursive case seklinde ayirmak. Sonra list comprehension’lar acilabilir istege gore.
Bu konu başlığı altında yine @aib yazmış olduğu fonksiyonlardan
N basamaklı bir merdiveni kaç farklı şekilde çıkabileceğimize veya
x adım atarak kaç farklı şekilde çıkabileceğimize cevap bulabiliyoruz