Hogyan állítsuk elő a Pascal háromszög sorait, és mire használjuk?

Az iskolai matematikából is ismert a Pascal háromszög. Azt, hogy ez mi, több megközelítési móddal is le lehet írni. Többek között úgy is meghatározható, hogy olyan egymást követő sorozatok elemeiből áll, amelyek 1-gyel kezdődnek és 1-gyel végződnek, a többi elem pedig az előző sorozatból származtatható olyan módon, hogy egy k indexű elem az előző sor k-1 és k indexű elemeinek összege. Így, minden egyes sor az előző sornál eggyel hosszabb. A Pascal háromszög alapvető jellemzői az ábra mutatja.

Ennek alapján azt is lehet mondani, hogy a Pascal háromszög a binomiális együtthatók háromszög alakban történő elrendezése. A binomiális együtthatók értéke pedig „n alatt a k”, azaz egy n elemű halmaz k elemű részhalmazainak a száma, vagy kombinatorikai szóhasználattal: a kombinációk számát adja meg, vagyis azt, hogy hányféleképpen választható ki k elem n különböző elem közül.

Bár a Pascal háromszögnek elsősorban elméleti a jelentősége, de a kombinációk számítása kapcsán olykor jól jöhet. A Python 3.8 verziójától a math modulban rendelkezésre áll a comb(n, k) függvény, amivel könnyen számolhatunk kombinációt. Az ennél korábbi Python verziók esetén a kombinációk számát faktoriálisakkal lehet ugyan számolni az n!/(n-k)!/k! képlettel, de ez egyrészt float eredményt ad, ami nem mindig megfelelő és így extra típuskonverziót igényelhet, másrészt a float típusnál elkerülhetetlen számítási pontatlanság is felléphet, ami például összehasonlításoknál jelenthet gondot /ha int típus lenne az eredmény ilyen gond nem lépne fel/. Erre láthatunk példát alább.

Ha tehát int eredményt szeretnénk és nincs comb() függvény, akkor megoldási eszközként használhatjuk a Pascal háromszöget. Továbbá akkor is bevethetjük, ha ismerjük a kombinációk számát, valamint az n vagy k értékét, és keressük a fennmaradó ismeretlent.

Ahhoz, hogy alkalmazni tudjuk a Pascal háromszöget, készíteni kell egy olyan függvényt, amely annak n. sorát adja ki. Alább több megvalósítási változatot mutatunk aszerint, hogy a függvénytörzsben rekurziót vagy ciklust alkalmazunk, vagy generátorfüggvényt készítünk. A Pascal háromszög fent megadott definícióját követik a kódsorok, így különösebb magyarázatra nem szorulnak. A rekurziós megoldásban egy memoizált változatot is mutatunk.

A függvényeket a fentebb említett alkalmazási esetekre teszteltük, amiket alább követhetünk nyomon.

Ehhez a témához, illetve a mintakódokhoz kapcsolódóan a Python tudásépítés lépésről lépésre című e-könyvben a a math modul mellett a rekurzív és generátorfüggvények létrehozásáról, valamint a memoizációról, illetve a listaépítőkről, a listák összefűzéséről és elemeik kicsomagolásáról szóló részeket érdemes feleleveníteni vagy tanulmányozni.

Érdekel a Python tudásépítés lépésről lépésre az alapoktól az első asztali alkalmazásig című e-könyv.