milosijaa Milos djordjevic PHP Developer srbija
Član broj: 88371 Poruke: 135 *.dialup.neobee.net.
|
EVO RESENJJA
mala napomena.
kod je pisan u MODULA2 jeziku koa sto vidis sintaksa naredbi je veoma slicna turbo paskalu.... Nadam se da to nije ptoblem. U svakom slucaju ideja se vidi.
Malo cu iskomentarisati kod. Bar ono sto je specificno za modulu...
MODULE Okt296_1;
FROM UniStack IMPORT Stack, MakeStack, MakeNull, Empty, Push, Pop;(* uvoz procedura iz nekog modula za rad sa stekom*)
FROM IO IMPORT WrStr, WrInt, WrLn; (*uvoz procedura za ispis*)
PROCEDURE Han(n,a,b,c: INTEGER);(*originalna rekurzivna procedura, dakle polazni problem*)
BEGIN
IF n=1 THEN
WrInt(a,10); WrInt(b,10); WrLn;
ELSE
Han(n-1,a,c,b);
Han(1,a,b,c);
Han(n-1,c,b,a)
END
END Han;
TYPE LocalV = RECORD
n,a,b,c,callid: INTEGER;
END;
PROCEDURE HanI(nn,aa,bb,cc: INTEGER);(*nerekurzivno resenje*)
VAR s: Stack;
lv: LocalV;
tmp: INTEGER;
BEGIN
MakeStack(s,SIZE(lv),TRUE);
lv.n:=nn; lv.a:=aa; lv.b:=bb; lv.c:=cc; lv.callid:=0;
Push(s,lv);
WITH lv DO
REPEAT
CASE callid OF
0: IF n=1 THEN
WrInt(a,10); WrInt(b,10); WrLn;
Pop(s,lv);
ELSE
callid:=1;
Push(s,lv);
DEC(n); tmp:=b; b:=c; c:=tmp; callid:=0;
END; |
1: callid:=2;
Push(s,lv);
n:=1; callid:=0; |
2: callid:=3;
Push(s,lv);
DEC(n); tmp:=a; a:=c; c:=tmp; callid:=0; |
3: Pop(s,lv); |
END
UNTIL Empty(s);
END (* WITH *)
END HanI;(*kraj nerekurzivne procedure*)
VAR n: INTEGER;
BEGIN(*telo glavnog programa*)
n:=3;
WrStr('Rezultat rekurzivne procedure je:'); WrLn; Han(n,1,2,3); WrLn;
WrStr('Rezultat iterativne procedure je:'); WrLn; HanI(n,1,2,3); WrLn;
END Okt296_1.
ps. nadam se da ti je pomoglo.
Ovaj problem mozes resiti i sa 2 petlje. REPEAT petljom unutar jedne WHILE petlje (dakle bez CASE).
.....
|