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:
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.
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”).
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:
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.
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")
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.