Chuck Norris elszámolt a végtelenig. Kétszer.

Chucnk Norris elszámolt kétszer a végtelenig.

“Elszámoltam a végtelenig. Kétszer.” – nyilatkozta az ünnepelt filmszínész.

Ha még nem olvastál Chuck Norris vicceket, itt az ideje.
Mi meg addig elfilózgatunk itt azon, hogy meddig tudunk elszámolni mi magunk. És arról, hogy meddig tud a Python. Meg arról, hogy mi az a végtelen ciklus.

Szóval az úgy van, hogy a számítógépek nyilvánvalóan nem tudnak elszámolni a végtelenig, és ebben nagyon hasonlítanak az emberekre – egy kivételével, persze. A számolásuk felső határa attól is függhet, hogy milyen programozási nyelven próbálkozunk azt elérni. A Python esetében ez platformfüggő: más lesz különféle gépeken és oprendszereken. Hogy nálad épp mennyi? Hát, derítsd ki!

Ha a while-ciklus belsejében újra meg újra növelünk egy változót és mindig kiíratjuk, elvileg eljutunk addig, amíg a Python el tud számolni. Már csak az a kérdés, milyen feltételt írjunk a while mellé.

A while-ciklus – eddig ezt gondosan titkoltam – úgynevezett elöltesztelő ciklus, azaz a ciklus elején dönti el, hogy belép-e vagy sem, és a while mellé írt feltétel – ezt meg már láttad, csak nem mondtuk ki ilyen szépen – a ciklusba való belépés feltétele. (Ciklusból van még számlálós, bejárós meg hátultesztelő, ezek közül a Pythonban már csak a bejárós van, úgyhogy nyugika.)

Azaz valami olyan feltételt kell írni a while mellé, ami mindig igaz marad. Legyen mondjuk ez a program:

x = 0
while 'a' != 'b':
    x += 1
    print(x)

És minthogy a csak egészen ritkán egyenlő b-vel (merthogy ezek most nem változók, hanem a konkrét betűk), ezennel megalkottuk a félig-meddig végtelen ciklust. A végtelen ciklusból nincs kilépés, hacsak valami rossz nem történik. Esetünkben fog: egyszer eljutunk az utolsó számig, amit a Python a gépünkön ábrázolni képes, ‘szt ott majd elszáll a program. Én már futtatom is, szerintem neked is itt az ideje. Ha elindult, majd olvasol tovább.

Az ‘a’ != ‘b’ feltétel olyan, mint amikor elszakad az övünk, vagy leesik róla a csat, és madzagot teszünk helyette. Teszi a dolgát, nem csúszik a nadrág, de attól még ronda. És ciki. Mit lehetne helyette írni? Gondoljuk át: a while mellett egy logikai kifejezés, azaz bool érték van. Az ‘a’ != ‘b’ ugyebár igaz, azaz True. Na, valami megmozdult? … Mi van, ha rögtön a nagybetűs (szó szerint) Igazságot írjuk oda?

x = 0
while True:
    x += 1
    print(x)
Okoska a végtelen ciklusról nyilatkozik

A mai hardverek a végtelen ciklust is véges idő alatt fejezik be – magyarázza egy aprajafalvi kocka

És működik! Ráadásul gyorsabb, mint az előző verzió, hiszen ott minden ciklus elején ki kell értékelnie a feltételünket a Pythonnak, itt meg rögtön a végeredményt (mármint hogy az ‘a != ‘b’ kifejezés értéke True) mondjuk meg neki. Persze a programunk esetében a korlátozó tényező a kiírás sebessége lesz – ha összehúzod a parancssori ablakot egy sorra, sokat gyorsul a számolás.

Az imént azt mondtam, hogy a ciklusunk csak félig-meddig végtelen. Ha a harmadik sort kihagyjuk, teljesen végtelen lesz.

A programozók rendesen igyekeznek elkerülni, hogy akár véletlen is végtelen ciklusba kerüljön a program, mert akkor a türelmesebb felhasználók ott öregszenek meg a program előtt – a többiek meg kivágják az egészet, mint macskát szarni. A követező videóban erről elmélkedem:

Feladat

F0010a: A múltkor megoldottuk a x2 + 2x + 5 = 11668 egyenletet (a természetes, majd az egész számok halmazán). Ha a tanár elírja a feladatot, akkor esetleg nincs megoldás. Írd meg a while-ciklus feltételét úgy, hogy a ciklus ne váljon végtelen ciklussá, ha például a x2 + 2x + 5 = 11667 egyenletet kell megoldanod!

 

A múltkor egyismeretlenes egyenletet oldottunk meg while-ciklussal. Legközelebb beágyazott ciklusokkal foglalkozunk.

Advertisements

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s