Kurzusok
/
Python
Python
/
Feladatok
/
Pascal-háromszög
Pascal-háromszög

Pascal-háromszög

Közepes

Bevezetés

Mivel remek az idő, egyáltalán nem vágysz rá, hogy egy órát egy tanteremben tölts. Bosszúsan belépsz a tanterembe, ahol egy furcsán kielégítő háromszög alakot veszel észre a táblán. Amíg a matektanárodra vársz, óhatatlanul észreveszel néhány mintázatot a háromszögben: a szélső értékek mind egyesek, minden következő sorban eggyel több érték van, mint az előzőben, és a háromszög szimmetrikus. Fura!

Nem sokkal azután, hogy leülsz, belép a tanár a terembe, és elmagyarázza, hogy ez a háromszög nem más, mint a híres Pascal-háromszög.

A következő órában a tanárod lenyűgöző dolgokat tár fel, amelyek ebben a háromszögben rejlenek:

  • Segítségével kiszámítható, hogy N érték közül hányféleképpen választhatsz ki K elemet.
  • Megtalálható benne a Fibonacci-sorozat.
  • Ha a páratlan és a páros számokat különböző színnel jelölöd, egy gyönyörű mintázatot kapsz, amit Sierpiński-háromszögnek neveznek.

A tanár arra kér téged és az osztálytársaidat, hogy nézzetek utána más felhasználási módoknak is, és biztosít róla, hogy még rengeteg van! Ebben a pillanatban megszólal az iskolacsengő. Rájössz, hogy az elmúlt egy órában teljesen elmerültél a Pascal-háromszög megismerésében. Gyorsan kikapod a laptopodat a táskádból, és kimentek a szabadba, készen arra, hogy élvezd a napfényt és a Pascal-háromszög csodáit.

Utasítások

A feladatod, hogy kiírd a Pascal-háromszög első N sorát.

A Pascal-háromszög pozitív egész számok háromszög alakban elrendezett tömbje.

A Pascal-háromszögben egy sorban annyi érték van, amennyi a sor száma (amely egytől indul). Ezért az első sorban egy érték van, a másodikban kettő, és így tovább.

A legelső (legfelső) sorban egyetlen érték van: 1. A további sorok értékeit úgy számítjuk ki, hogy összeadjuk az előző sorban az aktuális pozíció közvetlenül jobbra és balra lévő számait.

Ha az előző sorban az aktuális pozíciótól balra vagy jobbra nincs érték (ez csak a legszélső baloldali és jobboldali pozícióknál fordul elő), akkor az adott pozíció értékét nullának tekintjük (az összegzésben gyakorlatilag „figyelmen kívül hagyjuk”).

Példa

Nézzük meg a Pascal-háromszög első 5 sorát:

    1
   1 1
  1 2 1
 1 3 3 1
1 4 6 4 1

A legfelső sorban egyetlen érték van, ami 1.

A legszélső bal- és jobboldali értékeknél csak egyetlen előző pozíciót vehetünk figyelembe, mégpedig a tőlük jobbra, illetve balra esőt. Mivel a legfelső érték 1, ebből az következik, hogy minden legszélső bal- és jobboldali érték szintén 1.

A többi értéknél két pozíciót kell figyelembe venni. Például az ötödik sor (1 4 6 4 1) középső értéke 6, mivel az előző sorban tőle balra és jobbra a 3 és a 3 áll:

Hogyan valósul meg ez a feladat Pythonban: rekurzió

Ez a feladat úgy készült, hogy a recursion használatával oldd meg, ne ciklusokkal. A rekurzív függvény olyan függvény, amely meghívja önmagát. Ez hasznos olyan problémák megoldásánál, amelyek önmagukra vezethetők vissza. A végtelen rekurzió elkerülésére (pontosabban a verem túlcsordulásának elkerülésére) egy úgynevezett „alapesetet” használunk. Amikor elérjük az alapesetet, egy nem rekurzív érték adódik vissza, ami lehetővé teszi, hogy az előző függvényhívás befejeződjön és visszaadja az értékét, és így tovább, visszafelé a vermen, amíg az első függvényhívás vissza nem adja a választ. Írhatunk egy rekurzív függvényt, amely kiszámítja az 5! (azaz 5 * 4 * 3 * 2 * 1) értékét, például így:

def factorial(number):
  if number <= 1:  # base case
    return 1

  return number * factorial(number - 1) # recursive case

print(factorial(5)) # returns 120

Végül meg kell jegyezni, hogy a Python korlátozza a rekurzív hívások számát (alapértelmezés szerint 1000), és nem optimalizálja a farokrekurziót.

Kivételüzenetek

Néha szükséges kivételt dobni. Amikor ezt teszed, mindig adj meg egy beszédes hibaüzenetet, amely jelzi a hiba forrását. Ez olvashatóbbá teszi a kódodat, és jelentősen segít a hibakeresésben. Azokban az esetekben, amikor tudod, hogy a hiba forrása egy bizonyos típusú, választhatsz, hogy a beépített hibatípusok egyikét dobod, de ilyenkor is adj meg egy beszédes üzenetet.

Ez a feladat megköveteli, hogy a raise utasítás segítségével „dobj” több ValueErrors-t, ha a rows() függvénynek negatív számot adsz át. A tesztek csak akkor fognak sikeresen lefutni, ha raise-t használsz a exception dobásához, és üzenetet is mellékelsz hozzá.

Ha egy ValueError-t üzenettel szeretnél dobni, írd az üzenetet a exception típus argumentumaként:

# if the rows function is passed a negative number.
raise ValueError("number of rows is negative")
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
Python Exercism

Készen állsz elkezdeni a(z) Pascal-háromszög feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) Python nyelvet 17 fogalom146 feladat segítségével, valódi emberi mentorálással, mindez ingyen.