Ponavljaj dokler...
Naša prva zanka
Najprej malo refleksije. Kaj znamo narediti doslej: znamo napisati program,
ki kaj vpraša, kaj računa in kaj izpiše. Naši programi se izvajajo od
začetka do konca, s tem da lahko vmes preskočijo kak blok ukazov, ki se
nahajajo znotraj kakega if
ali else
. Zdaj pa se
bomo naučili napisati
programe, v katerih se del programa ponavlja.
V večini programskih jezikov to naredimo z nečim, čemur rečemo zanka. Tisočletna tradicija veleva, da mora biti začetnikov prvi program z zanko program, ki šteje do deset. V Pythonu je videti takole:
Zanka while
je po svoje podobna stavku if
. Medtem
ko se stavki znotraj if
izvedejo, če je pogoj
resničen, se stavki znotraj while
ponavljajo,
dokler je pogoj resničen. "If" je "če" in "while" je "dokler", to
vedo celo učiteljice angleščine. Gornji program lahko torej kar dobesedno
prevedemo iz Pythona v slovenščino:
K temu ni potrebna več nobena razlaga, ne?
Kaj je domneval Collatz
Vzemimo poljubno število in z njim počnimo tole: če je sodo, ga delimo z 2, če je liho, pa ga pomnožimo s 3 in prištejmo 1. To ponavljamo, dokler ne dobimo 1.
Za primer vzemimo 12. Ker je sodo, ga delimo z 2 in dobimo 6. 6 je sodo, torej ga delimo z 2 in dobimo 3. 3 je liho, torej ga množimo s 3 in prištejemo 1 - rezultat je 10. 10 je sodo, zato ga delimo z 2 in dobimo 5... Celotno zaporedje je 12, 6, 3, 10, 5, 16, 8, 4, 2, 1. Ko pridemo do 1, se ustavimo.
Matematiki, ki vedno radi počnejo koristne reči, si belijo glavo z vprašanjem, ali se reč vedno izteče ali pa se lahko kdaj tudi zacikla tako, da se zaporedje ponavlja in ponavlja v nedogled. Lothar Collatz, konkretno je že od leta 1937 domneval, da se zaporedje vedno izteče. Kot pravi njegov življenjepis, se je njegovo domnevanje končalo leta 1990, matematiki pa domnevajo domnevo še naprej. Eden sicer najbolj nesutrašnih matematikov 20. stoletja, couch surfer Erdos, je na to temo rekel, da matematika za takšna vprašanja še ni zrela.
Naši cilji bodo skromnejši: napisali bomo program, ki mu bo uporabnik vpisal število in program bo izpisal zaporedje, kot je bilo gornje.
Najprej povejmo kar po slovensko:
Tole skoraj že znamo prevesti v Python (prevod bo pravzaprav dobeseden), odkriti moramo le, kako preveriti, ali je število sodo. Če kdo misli, da tudi za to obstaja funkcija, se, izjemoma, moti. Pač pa znamo izračunati ostanek po deljenju, konkretno, ostanek po deljenju z 2. Če je enak 0, je število sodo.
Prevedimo torej one klene slovenske besede v pythonovske.
Popaziti je potrebno, da izpišemo tako prvo kot zadnje število, zato bomo
potrebovali še en print
izven zanke: po zanki izpišemo še zadnji
člen zaporedja, 1. Namesto print(1)
bi lahko napisali tudi
print(n)
- tako ali tako vemo, da je n
enak 1, saj
program sicer ne bi prišel do tam, do koder je prišel, namreč onstran zanke, ki
teče, dokler je n
različen od 1.
Dodajmo še nekaj: na koncu naj se izpiše, koliko členov ima zaporedje. Na
začetku programa bomo postavili števec clenov
na 1 in ga v vsakem
krogu (učeno: v vsaki iteraciji) zanke povečali za 1. Na koncu pa bomo izpisali
nekaj v slogu "Zaporedje, ki se začne z 12, ima deset členov".
Ups. V zanki smo pokvarili n
, spremenil smo ga v 1. To bomo
rešili tako, da shranimo začetno število v še eno spremenljivko.
Število smo si zapomnili v prvi vrstici, shranili smo ga v
zac
. (V tem programu tudi prvič vidimo, da lahko prirejanja kar
nizamo - pisati smemo a = b = c = 42
.) Ustrezno popravimo še
izpis v zadnji vrsti.