Ez az oktatóanyag megtanítja, hogyan nyomtathatja ki a Pascal-háromszöget Pythonban adott számú sorra.
Kezdje azzal, hogy megtanulja megszerkeszteni a Pascal-háromszöget. Ezután írjon egy Python-függvényt, és megtanulja tovább optimalizálni.
▶️ Kezdjük!
Tartalomjegyzék
Mi a Pascal-háromszög és hogyan kell megépíteni?
A Pascal-háromszög adott számú sorra való nyomtatása népszerű interjúkérdés.
Az n soros Pascal-háromszögben az i számú sor i elemet tartalmaz.
Tehát az első sorban egy elem van, és ez 1. És a következő sorok minden eleme a közvetlenül felette lévő két szám összege.
A következő ábra bemutatja, hogyan kell megszerkeszteni az ötsoros Pascal-háromszöget.
Pascal-háromszög, ha numRows = 5 (a szerző képe)
Figyeld meg, hogyan írhatsz be nullákat, ha csak egy szám van egy bizonyos szám felett.
📝Gyors gyakorlatként kövesse a fenti eljárást Pascal-háromszög megszerkesztéséhez n = 6 és n = 7 esetén.
Ezután folytassuk a kód írását. Dönthet úgy, hogy a kódrészleteket a etoppc.com Python IDE-jén futtatja közvetlenül a böngészőből – miközben végighalad az oktatóanyagon.
Python függvény Pascal háromszögének kinyomtatására
Ebben a részben írjunk egy Python-függvényt a Pascal-háromszög nyomtatásához tetszőleges számú sorhoz.
Két kulcsfontosságú kérdést kell megfontolni:
- Hogyan fejezzük ki a Pascal-háromszög bejegyzéseit?
- Hogyan nyomtathatom ki a Pascal-háromszöget megfelelő térközzel és formázással?
Most válaszoljunk rájuk.
#1. Mi a kifejezés a Pascal-háromszög egyes bejegyzéseire?
Megesik, hogy a Pascal-háromszög bejegyzéseit az nCr képletével kaphatjuk meg. Ha visszaemlékezik az iskolai matematikából, az nCr azt jelöli, hogy hány módon választhat ki r elemet egy n elemből álló halmazból.
Az nCr képlete az alábbi:
nCr képlet (a szerző képe)
Most folytassuk a Pascal-háromszög bejegyzéseinek kifejezését az nCr képlet segítségével.
Pascal-háromszög bejegyzései nCr használatával (a szerző képe)
Megtaláltuk a módot a mátrix bejegyzéseinek kifejezésére.
#2. Hogyan állítsuk be a távolságot a minta nyomtatása során?
A Pascal-féle numRows háromszögben az 1. sor egy bejegyzést tartalmaz, a 2. sorban két bejegyzés található, és így tovább. A minta háromszögként történő nyomtatásához numRows – i szóközre lesz szüksége az #i sorban. És ehhez használhatja a Python range függvényét a for ciklussal együtt.
Mivel a tartomány függvény alapértelmezés szerint kizárja a végpontot, ügyeljen arra, hogy adjon hozzá + 1-et, hogy megkapja a szükséges számú kezdő szóközt.
Most, hogy megtanulta a bejegyzések ábrázolását és a szóköz beállítását Pascal-háromszög nyomtatása közben, folytassuk a pascal_tri függvény meghatározásával.
A függvénydefiníció elemzése
Tehát mit szeretne tenni a pascal_tri függvényrel?
- A pascal_tri függvénynek el kell fogadnia a sorok számát (numRows) argumentumként.
- Ki kell nyomtatnia a Pascal-háromszöget numRows értékkel.
A faktoriális kiszámításához használjuk a Python beépített matematikai moduljának faktoriális függvényét.
▶️ Futtassa a következő kódcellát a faktoriális importálásához, és használja azt az aktuális moduljában.
from math import factorial
Az alábbi kódrészlet tartalmazza a függvénydefiníciót.
def pascal_tri(numRows): '''Print Pascal's triangle with numRows.''' for i in range(numRows): # loop to get leading spaces for j in range(numRows-i+1): print(end=" ") # loop to get elements of row i for j in range(i+1): # nCr = n!/((n-r)!*r!) print(factorial(i)//(factorial(j)*factorial(i-j)), end=" ") # print each row in a new line print("n")
A funkció a következőképpen működik:
- A pascal_tri függvénynek egy kötelező paramétere van, a numRows: a sorok száma.
- Összesen numRows sor van. Minden i sorhoz hozzáadunk numRows – i szóközöket a sor első bejegyzése előtt.
- Ezután az nCr képletet használjuk az egyes bejegyzések kiszámításához. Az i. sorban a bejegyzések iCj, ahol j = {0,1,2,…,i}.
- Figyeljük meg, hogy az egész számok osztását végrehajtó //-t használjuk, mivel azt szeretnénk, hogy a bejegyzések egész számok legyenek.
- Miután az összes bejegyzést kiszámolta egy sorban, nyomtassa ki a következő sort egy új sorban.
🔗 Ahogy hozzáadtuk a docstring, használhatja a Python beépített súgófüggvényét vagy a __doc__ attribútumot a függvény dokumentumkarakterláncának eléréséhez. Az alábbi kódrészlet bemutatja, hogyan kell ezt megtenni.
help(pascal_tri) # Output Help on function pascal_tri in module __main__: pascal_tri(numRows) Print Pascal's triangle with numRows. pascal_tri.__doc__ # Output Print Pascal's triangle with numRows.
Most menjünk tovább, és hívjuk meg a függvényt a sorok számával argumentumként.
pascal_tri(3) # Output 1 1 1 1 2 1
A Pascal-háromszög első 3 sora a vártnak megfelelően ki lesz nyomtatva.
Nyomtassa ki a Pascal-háromszöget rekurzió segítségével
Az előző részben azonosítottuk a Pascal-háromszög egyes bejegyzéseinek matematikai kifejezését. A két egymást követő sorban szereplő bejegyzések közötti kapcsolatot azonban nem használtuk fel.
Valójában az előző sort használtuk a következő sor bejegyzéseinek kiszámításához. Nem használhatjuk ezt, és nem találhatjuk meg a pascal_tri függvény rekurzív megvalósítását?
Igen, tegyük meg!
A rekurzív megvalósításban egy függvény ismételten meghívja magát, amíg az alapeset teljesül. A Pascal-háromszög felépítésénél az első sorral kezdjük egy bejegyzéssel 1, majd építjük fel a következő sorokat.
Tehát a pascal_tri(numRows) függvény meghívása a pascal_tri(numRows-1) függvényt és így tovább, amíg el nem érjük a pascal_tri(1) alapesetet.
Tekintsük azt a példát, ahol a Pascal-háromszög első 3 sorát kell kinyomtatni. A következő kép bemutatja, hogyan kerülnek a rekurzív hívások a verembe. És hogyan adják vissza a rekurzív függvényhívások a Pascal-háromszög sorait.
Hívásverem rekurzív hívások közben (a szerző képe)
▶️ Futtassa az alábbi kódrészletet a Pascal-háromszög sorainak rekurzív generálásához.
def pascal_tri(numRows): '''Print Pascal's triangle with numRows.''' if numRows == 1: return [[1]] # base case is reached! else: res_arr = pascal_tri(numRows-1) # recursive call to pascal_tri # use previous row to calculate current row cur_row = [1] # every row starts with 1 prev_row = res_arr[-1] for i in range(len(prev_row)-1): # sum of 2 entries directly above cur_row.append(prev_row[i] + prev_row[i+1]) cur_row += [1] # every row ends with 1 res_arr.append(cur_row) return res_arr
Íme néhány szempont, amit érdemes megjegyezni:
- Adatstruktúraként egy beágyazott listát használtunk, ahol a Pascal-háromszög minden sora önmagában is egy lista, például: [[row 1], [row 2],…,[row n]].
- A pascal_tri(numRows) függvényhívás rekurzív hívások sorozatát indítja el a numRows – 1, a numRows – 2 argumentumokkal egészen 1-ig. Ezek a hívások egy verembe kerülnek.
- Ha numRows == 1, akkor elértük az alapesetet, és a függvény visszatér [[1]].
- Most a visszaadott listát a hívási verem következő függvényei használják – a következő sor kiszámításához.
- Ha a cur_row az aktuális sor, akkor cur_row[i] = előző_sor[i] + előző_sor[i+1]-2 elem összege közvetlenül az aktuális index felett.
Mivel a visszaadott tömb egy beágyazott lista (listák listája), módosítanunk kell a térközt, és ki kell nyomtatnunk a bejegyzéseket, ahogy az alábbi kódcellában látható.
tri_array = pascal_tri(5) for i,row in enumerate(tri_array): for j in range(len(tri_array) - i + 1): print(end=" ") # leading spaces for j in row: print(j, end=" ") # print entries print("n") # print new line
A kimenet helyes, az alábbiak szerint!
# Output 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1
Python-függvény a Pascal-háromszög kinyomtatására numRows ≤ 5 esetén
Mindkét tanult módszer működik a Pascal-háromszög tetszőleges számú, numRows sorra történő kinyomtatásában.
Vannak azonban olyan esetek, amikor kisebb számú sorhoz kell kinyomtatni a Pascal-háromszöget. És ha a nyomtatandó sorok száma legfeljebb 5 – használhat egy egyszerű technikát.
Menjen végig az alábbi ábrán. És figyeld meg, hogy a 11 hatványai mennyire azonosak a Pascal-háromszög bejegyzéseivel. Figyeljük meg azt is, hogy ez csak a 11 4. hatványáig működik. Vagyis a 11-et a {0, 1, 2, 3, 4} hatványokra emelve a Pascal-háromszög 1-5. soraiban lévő bejegyzéseket kapjuk.
Írjuk át a függvénydefiníciót az alábbiak szerint:
def pascal_tri(numRows): '''Print Pascal's triangle with numRows.''' for i in range(numRows): print(' '*(numRows-i), end='') # compute power of 11 print(' '.join(str(11**i)))
Így működik a pascal_tri függvény:
- Az előző példákhoz hasonlóan itt is módosítjuk a távolságot.
- Ezután a Python hatványozási operátorát (**) használjuk a 11 hatványainak kiszámításához.
- Mivel a 11 hatványai alapértelmezés szerint egész számok, az str() használatával alakítsa át őket karakterláncokká. Mostantól a 11-es képességei vannak húrként.
- A Pythonban a karakterláncok iterálhatók – így végig lehet őket lépni, és egyszerre csak egy karaktert érhet el.
- Ezután használhatja a join() metódust a következő szintaxissal:
.join( ) az elemeinek összekapcsolásához a elválasztóként. - Itt egyetlen szóközre van szükség a karakterek között, így a
‘ ‘ lesz, az pedig string: 11 hatványa.
Ellenőrizzük, hogy a funkció rendeltetésszerűen működik-e.
pascal_tri(5) # Output 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1
Egy másik példaként hívja meg a pascal_tri függvényt 4-gyel argumentumként.
pascal_tri(4) # Output 1 1 1 1 2 1 1 3 3 1
Remélem, megérti, hogyan nyomtathatja ki egyszerűen a Pascal-háromszöget az 1-től 5-ig terjedő számsorokhoz.
Következtetés
Íme, amit megtudtunk:
- Hogyan készítsünk Pascal-háromszöget adott számú sorral. Minden sor minden szám a közvetlenül felette lévő két szám összege.
- Írjon Python függvényt az nCr = n!/(nr)!.r képlet segítségével! a Pascal-háromszög bejegyzéseinek kiszámításához.
- Ezután megtanulta a függvény rekurzív megvalósítását.
- Végül megtanulta a legoptimálisabb módszert Pascal-háromszög megszerkesztésére 5-ig terjedő számsorokhoz – 11 hatványait használva.
Ha szintre szeretné emelni Python-készségeit, tanulja meg mátrixok szorzását, ellenőrizze, hogy egy szám prím-e, és oldjon meg problémákat a karakterlánc-műveletekkel kapcsolatban. Boldog kódolást!