Petlje (3)
Petlja while
U pravilu se petlja while upotrebljava onda kada broj prolazaka kroz petlju nije poznat unaprijed, nego ovisi o ispunjenju nekog uvjeta.
Opći je oblik petlje while:
while uvjet :
tijelo petlje
Koraci petlje će se ponavljati tako dugo dok je uvjet ispunjen, tako da u tijelu petlje treba omogućiti promjenu vrijednostî o kojima ovisi ispunjenje uvjeta.
13 6 6 3 3 1 13 6 6 3 3 1 |
Metoda polovljenja
Metoda polovljenja jedan je od postupaka nalaženja nul–točke realne funkcije f realne varijable x u zadanom intervalu [xmin,xmax].
Pretpostavljamo da je funkcija na intervalu neprekinuta i da njezine vrijednosti u točkama xmin i xmax imaju različite predznake. Ako su f(xmin) i f(xmax) različitih predznaka, onda je f(xmin)⋅f(xmax)<0.
U tom slučaju graf funkcije f u intervalu [xmin,xmax] barem jednom siječe os x. Vrijednost f(xmid) u polovištu intervala xmid=xmin+xmax2 imat će predznak kao f(xmin) ili kao f(xmax). Ako f(xmid) i f(xmin) imaju različite predznake (to jest, ako je f(xmin)⋅f(xmid)<0), onda je barem jedna nul–točka u intervalu [xmin,xmid]. I obratno, ako f(xmid) i f(xmax) imaju različite predznake (što znači da f(xmid) i f(xmin) imaju isti predznak), barem je jedna nul–točka u intervalu [xmid,xmax]. Na taj ćemo način u svakom koraku prepoloviti interval u kojemu tražimo nul–točku.
Postupak prekidamo onda kada se duljina intervala smanji ispod unaprijed zadanoga praga τx, odnosno, koraci se ponavljaju tako dugo dok je duljina intervala veća od praga:
dok je xmax−xmin>τx :
xmid=xmin+xmax2
ako je f(xmin)⋅f(xmid)<0 :
tražimo u intervalu [xmin,xmid], pa je xmid „novi” xmax
inače :
tražimo u intervalu [xmid,xmax], pa je xmid „novi” xmin
rezultat je polovište posljednjega intervala, kraćeg od praga
Budući da se u svakom koraku duljina intervala raspolavlja, jasno je da će se prije ili kasnije smanjiti ispod zadanoga praga.
|
x ↦ x2−2
|
![]() |
1.41421356424689 5.29990096254096e-9 1.41421356424689 5.29990096254096e-9 |
-1.41421356145293 -2.60263344209477e-9 -1.41421356145293 -2.60263344209477e-9 |
1.41421356237308 -4.81836792687318e-14 1.41421356237308 -4.81836792687318e-14 |
Intermezzo o indeksiranju
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] |
13 13 |
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] |
13 13 |
6 6 |
[0, 1, 2, 3, 4, 5] 6 [7, 8, 9, 10, 11, 12] [0, 1, 2, 3, 4, 5] 6 [7, 8, 9, 10, 11, 12] |
3 3 |
[0, 1, 2] 3 [4, 5] [0, 1, 2] 3 [4, 5] |
4 4 |
[3] 4 [5] [3] 4 [5] |
9 9 |
[6, 7, 8] 9 [10, 11, 12] [6, 7, 8] 9 [10, 11, 12] |
7 7 |
[6] 7 [8] [6] 7 [8] |
6 6 |
[] 6 [] [] 6 [] |
Binarno pretraživanje
Binarno je pretraživanje algoritam koji omogućava razmjerno brzo nalaženje položaja odabrane vrijednosti u uređenom nizu, primjerice, u rastućemu ili u padajućem nizu brojeva ili u nizu riječi svrstanih po abecedi (kao u rječnicima)... Funkcija koju ćemo napisati tražit će zadani broj k u rastućem nizu brojeva s mogućim ponavljanjima, nazvanom a.
Zamisao algoritma temelji se na intuitivnom načinu traženja riječi u rječniku, a neobično nalikuje na metodu polovljenja.
Umjesto da se, kao u takozvanu linearnom pretraživanju, zadani broj uspoređuje s brojevima niza redom, od njegova početka prema kraju, u algoritmu binarnoga pretraživanja broj se prvo uspoređuje s brojem u sredini niza. Ako je zadani broj jednak „srednjemu” broju, pretraživanje je završeno — položaj je traženoga broja nađen (pritom, ako se broj ponavlja, možemo samo reći da smo ga našli, ali ne i jesmo li našli prvu, drugu ... ili zadnju njegovu pojavu u nizu). Ako je pak zadani broj manji od „srednjega”, može se nalaziti samo u prvoj polovini niza, a ako je veći, samo u drugoj polovini. U drugomu koraku s polovinom niza u kojoj se broj može nalaziti postupamo kao u prethodnu koraku s cijelim nizom: zadani broj uspoređujemo s brojem u sredini te polovine. Time smo interval u kojem ćemo (možda) morati nastaviti pretraživanje smanjili na četvrtinu nizu. U sljedećemu ćemo ga koraku smanjiti na osminu nizu, pa na šesnaestinu, i tako dalje.
Na početku je interval u kojemu tražimo cijeli niz, određen indeksima 0 i n, gdje je n broj brojeva u nizu. Neka je s indeks broja u sredini niza ako je n neparan ili posljednjega broja u prvoj polovini niza ako je n paran. Ako je as>k, onda pretraživanje nastavljamo u intervalu određenu indeksima 0 i s, a ako je as<k, tražit ćemo u intervalu određenu indeksima s+1 i n. I tako dalje.
Pretraživanje završava kad pronađemo traženi broj ili kad interval pretraživanja ostane prazan. U prvom ćemo slučaju „izaći” ne samo iz petlje, nego i iz funkcije, vraćajući indeks položaja u nizu na kojemu se nalazi traženi broj. U drugomu slučaju traženi broj nije u nizu — mogućnost da broj pronađemo postoji tako dugo dok interval pretraživanja sadrži barem jedan broj. Ako broj nije u nizu, vratit ćemo vrijednost koja nije indeks broja u nizu, −∞.
|
[-22, -22, -21, -20, -19, -18, -17, -17, -17, -15, -13, -13, -12, -10, -10, -6, -5, -4, -2, 4, 5, 9, 15, 16, 23] [-22, -22, -21, -20, -19, -18, -17, -17, -17, -15, -13, -13, -12, -10, -10, -6, -5, -4, -2, 4, 5, 9, 15, 16, 23] |
[(0, -22), (1, -22), (2, -21), (3, -20), (4, -19), (5, -18), (6, -17), (7, -17), (8, -17), (9, -15), (10, -13), (11, -13), (12, -12), (13, -10), (14, -10), (15, -6), (16, -5), (17, -4), (18, -2), (19, 4), (20, 5), (21, 9), (22, 15), (23, 16), (24, 23)] [(0, -22), (1, -22), (2, -21), (3, -20), (4, -19), (5, -18), (6, -17), (7, -17), (8, -17), (9, -15), (10, -13), (11, -13), (12, -12), (13, -10), (14, -10), (15, -6), (16, -5), (17, -4), (18, -2), (19, 4), (20, 5), (21, 9), (22, 15), (23, 16), (24, 23)] |
20 20 |
-Infinity -Infinity |
6 6 |
24 24 |
-Infinity -Infinity |
1 1 |
-Infinity -Infinity |
Varijacija na temu
U programsku funkciju za binarno pretraživanje unijet ćemo dvije promjene:
|
[-22, -22, -21, -20, -19, -18, -17, -17, -17, -15, -13, -13, -12, -10, -10, -6, -5, -4, -2, 4, 5, 9, 15, 16, 23] [-22, -22, -21, -20, -19, -18, -17, -17, -17, -15, -13, -13, -12, -10, -10, -6, -5, -4, -2, 4, 5, 9, 15, 16, 23] |
20 20 |
True True |
19 19 |
False False |
[-22, -22, -21, -20, -19, -18, -17, -17, -17, -15, -13, -13, -12, -10, -10, -6, -5, -4, -2, 0, 4, 5, 9, 15, 16, 23] [-22, -22, -21, -20, -19, -18, -17, -17, -17, -15, -13, -13, -12, -10, -10, -6, -5, -4, -2, 0, 4, 5, 9, 15, 16, 23] |
22 22 |
True True |
[-22, -22, -21, -20, -19, -18, -17, -17, -17, -15, -13, -13, -12, -10, -10, -6, -5, -4, -2, 0, 4, 5, 9, 9, 15, 16, 23] [-22, -22, -21, -20, -19, -18, -17, -17, -17, -15, -13, -13, -12, -10, -10, -6, -5, -4, -2, 0, 4, 5, 9, 9, 15, 16, 23] |
27 27 |
Traceback (click to the left of this block for traceback) ... IndexError: list index out of range Traceback (most recent call last): File "<stdin>", line 1, in <module> File "_sage_input_87.py", line 10, in <module> exec compile(u'open("___code___.py","w").write("# -*- coding: utf-8 -*-\\n" + _support_.preparse_worksheet_cell(base64.b64decode("bFsyN10gPT0gMjU="),globals())+"\\n"); execfile(os.path.abspath("___code___.py")) File "", line 1, in <module> File "/tmp/tmpkaUCam/___code___.py", line 3, in <module> exec compile(u'l[_sage_const_27 ] == _sage_const_25 File "", line 1, in <module> IndexError: list index out of range |
izvan niza izvan niza |
[-22, -22, -21, -20, -19, -18, -17, -17, -17, -15, -13, -13, -12, -10, -10, -6, -5, -4, -2, 0, 4, 5, 9, 9, 15, 16, 23, 25] [-22, -22, -21, -20, -19, -18, -17, -17, -17, -15, -13, -13, -12, -10, -10, -6, -5, -4, -2, 0, 4, 5, 9, 9, 15, 16, 23, 25] |
0 0 |
True True |
0 0 |
False False |
[-23, -22, -22, -21, -20, -19, -18, -17, -17, -17, -15, -13, -13, -12, -10, -10, -6, -5, -4, -2, 0, 4, 5, 9, 9, 15, 16, 23, 25] [-23, -22, -22, -21, -20, -19, -18, -17, -17, -17, -15, -13, -13, -12, -10, -10, -6, -5, -4, -2, 0, 4, 5, 9, 9, 15, 16, 23, 25] |
Napomena na kraju: for i while
Petlja for može se lako zamijeniti petljom while:
1 3 5 7 9 11 1 3 5 7 9 11 |
1 3 5 7 9 11 1 3 5 7 9 11 |
|