Hogyan lehet kinyomtatni a Pascal-háromszöget Pythonban

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!

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.

  Az iPhone átküldése Firestickre

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.

  Keressen olcsó laptopokat kifejezetten játékra, programozásra vagy általános használatra

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.

  Excel fájlok egyesítése

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!