[ Au197/79 @ 27.11.2002. 11:11 ] @
Radio sam zadatak u kome je trebalo napisati program koji za za datu matricu dimenzija NxN ispunjenu celim brojevima krecuci se od bilo kog elementa u prvoj koloni do bilo kog elementa u poslednjoj koloni pronalazi put sa najmanjom sumom elemenata. Kretanje je moguce za 1 polje desno, gore i dole. Npr:

1 5 9 8
0 0 9 9
2 1 0 9
5 6 0 0

Napiso sam funkciju s(red, kol, smer) koja krece rekurzivno od svakog elementa pocetne kolone i nalazi najkraci od tog pocetka. Te rezultate cuvam u listi objekata klase Slog (klasa ima polje zbir gde pamti najmanju sumu i polje put gde se pamti najjeftinija putanja). Na kraju samo treba da da pronadjem element liste koji ima najmanje polje zbir.
I tu nastaje problem. Ja to radim klasicno u petlji ali kako god uradim petlju ona se izvrsi samo 1 put. Dakle nagradno pitanje je zasto se petlja u python-u ne petlja? Evo tog dela:
Code:

# uradi s() nad svakim redom
lista = []
for i in range(n):
    lista.append(s(i, 0, DESNO))
    
# nadji najmanju putanju iz liste 
najmanji = lista[0]
for i in range(1, n):
    print i
    if lista[i].zbir < najmanji.zbir:
        najmanji = lista[i]
            
return najmanji


Sve je u redu u kodu do poslednje petlje koja bi trebalo da se izvrsi 3 puta obzirom da je n = 4, a print i mora da odstampa 1, 2, 3, ali se odstampa samo 1!

Ja sam zadatak resio sa lista.sort() pa return lista[0] ali mi se cini da je to neefikasan nacin, a i zivo me zanima sta sa onom petljom nije u redu.

Prilažem i kompletan kod.
[ alex @ 27.11.2002. 14:01 ] @
Pre svega, kod ti je uzasno neorganizovan i necitljiv.. Deklarisanje funkcija u funkciji, klasa u funkciji, deklarisanje funkcije u sred implementacije druge funkcije, pa gde to ima???

Drugo, malo debagovanja pre postavljanja pitanja ne bi skodilo, jer je u tome problem.

Trece, korisi samo JEDAN tip indentovanja, ili space ili TAB.

Tebi ne radi skript jer ti ispred return najmanji stoji TAB umesto 4 space-a, te python misli da je to deo for petlje (koja je uvucena sa tab-ovima) pa odmah uradi return i izlazi iz funkcije.

Sredi tab-ove i space-ove i kod ce ti proraditi.
[ Au197/79 @ 27.11.2002. 14:21 ] @
U pravu si!
Greška u indent-u je posledica editora (UltraEdit). Kada mu se zada komanda indent on samo radi sa spejsovima, a ja inače koristim samo tabove.
Klasu sam stavio u funkciju jer mi samo tu treba. U suštini meni treba slog, a ne klasa. A funkciju s sam tu stavio jer ona koristi promenljivu tabela koju ne dobija preko liste argumenata, pa mi je bilo logično da je umotam u drugu funkciju. Kako bih inače mogao da tražim najjeftiniji put za 2 tabele?
Ako znaš bolji način, bio bih ti zahvalan da mi ga predočiš, pa da ga naučim.

Hvala za pomoć!
[ Au197/79 @ 28.11.2002. 05:37 ] @
Pogledao sam ponovo kod. Iz funkcije mat(tabela) bih izbacio definiciju klase Slog i funkciju min(a, b, c). Ali opet ne znam kako da izbacim funkciju s(red, kol, smer).
[ alex @ 28.11.2002. 11:18 ] @
Evo, prepravio sam ti kod i saljem ga uz poruku.

Elem, izbacio sam funkciju s() tako sto sam u argumente dodao varijablu tabela, sto je sasvim razumljivo.

Program radi bez problema, a i citljiviji je.

Preporucio bih ti da pre citanja Python dokumentacije malo procesljas proceduralno programiranje, jer je to tvoj osnovni problem u konkretnom zadatku.

Naravno, mogao je ceo zadatak da se resi kreiranjem jednog objekta koji ima deklarisane i implementirane metode za racunanje, ali ti takvo resenje prepustam za vezbu.

Pozdrav,
alex.
[ Au197/79 @ 30.11.2002. 08:21 ] @
Hvala još jednom.
Sada me zanima nešto. Ako imam listu referenci na objekte klase koja imaju redefinisan __str()__ metod zašto <print lista> ne poziva str metod za svaki element liste već kao rezultat dobijem adrese referenci. A kako to da lista.sort() pozove cmp() za svka element a prin neće slično da se ponaša?
[ tOwk @ 04.01.2003. 09:44 ] @
Hm, pretpostaviću da si umesto __str()__ mislio na __str__ (a zagrade možeš staviti posle ako hoćeš da naglasiš o čemu se radi).

[ Au197/79 @ 05.01.2003. 15:58 ] @
Da mislio sam na redefinisanje funkcije __str__(self) iz klase Object. Imaš kod poslat u ranijim postovima.
[ tOwk @ 05.01.2003. 20:30 ] @
Pa koristi __repr__ za liste, a ne __str__, ili napravi novu klasu MojaLista, koja će koristiti str() za ispis, umesto repr().