You are on page 1of 10

UVOD U PROGRAMIRANJE ZADACI ZA VEBU: REKURZIJA I REKURENTNI NIZOVI

6. Napisati program koji za dati ceo broj n, 0 n 42, ispisuje vrednost elementa rekurentnog niza fn. Niz je definisan na sledei nain: fn = fn-1 + fn-3 2 fn-4, n 4, poslednja cifra broja n je 5 fn = 3 fn-1 fn-2 fn-4, n 4, poslednja cifra broja n je < 5 f3 = 1, f2 = 2, f1 = 3, f0 = 1 Element fn izraunati: (a) rekurzivno preko definicije, (b) rekurzivno pomou akumulirajueg parametra, (c) iterativno. U sluajevima (b) i (c) voditi rauna o efikasnosti reenja.
MODULE Recurrent6; FROM InOut IMPORT WriteString, WriteLn, ReadInt, WriteInt; CONST granica = 42; PROCEDURE FRec1(n: INTEGER): INTEGER; BEGIN IF n = 0 THEN RETURN 1 ELSIF n = 1 THEN RETURN 3 ELSIF n = 2 THEN RETURN 2 ELSIF n = 3 THEN RETURN 1 ELSIF n MOD 10 >= 5 THEN RETURN FRec1(n-1) + FRec1(n-3) - 2*FRec1(n-4) ELSE RETURN 3*FRec1(n-1) - FRec1(n-2) - FRec1(n-4) END END FRec1; PROCEDURE FRec2(n: INTEGER): INTEGER; PROCEDURE F(f3, f2, f1, f0, i: INTEGER): INTEGER; BEGIN IF i > n THEN RETURN f3 ELSIF i MOD 10 >= 5 THEN RETURN F(f3+f1-2*f0, f3, f2, f1, i+1) ELSE RETURN F(3*f3-f2-f0, f3, f2, f1, i+1) END END F; BEGIN IF n = 0 THEN RETURN 1 ELSIF n = 1 THEN RETURN 3 ELSIF n = 2 THEN RETURN 2 ELSIF n = 3 THEN RETURN 1 ELSE RETURN F(1, 2, 3, 1, 4) END END FRec2;

PROCEDURE FIter(n: INTEGER): INTEGER; VAR f0, f1, f2, f3, fn: INTEGER; i: INTEGER; BEGIN f0 := 1; f1 := 3; f2 := 2; f3 := 1; IF n = 0 THEN fn := f0 ELSIF n = 1 THEN fn := f1 ELSIF n = 2 THEN fn := f2 ELSIF n = 3 THEN fn := f3 ELSE FOR i := 4 TO n DO IF i MOD 10 >= 5 THEN fn := f3+f1-2*f0 ELSE fn := 3*f3-f2-f0 END; f0 := f1; f1 := f2; f2 := f3; f3 := fn END END; RETURN fn END FIter; VAR n: INTEGER; BEGIN WriteLn; WriteString('Unesite n (0 <= n <= '); WriteInt(granica, 0); WriteString('): '); ReadInt(n); IF (0 <= n) AND (n <= granica) THEN WriteString('FRec1(n) = '); WriteInt(FRec1(n), 0); WriteLn; WriteString('FRec2(n) = '); WriteInt(FRec2(n), 0); WriteLn; WriteString('FIter(n) = '); WriteInt(FIter(n), 0) ELSE WriteString('n je van dozvoljenih granica'); END END Recurrent6.

7. Napisati program koji za dati ceo broj n, 0 n 35, ispisuje vrednost elementa rekurentnog niza fn. Niz je definisan na sledei nain: fn = fn-1 + fn-2 2fn-3, n 3, n 2 (mod 3) fn = 2fn-2 3fn-3, n 3, n 1 (mod 3) fn = fn-1 + fn-3, n 3, n 0 (mod 3) f2 = 1, f1 = 2, f0 = 3 Element fn izraunati: (a) rekurzivno preko definicije, (b) rekurzivno pomou akumulirajueg parametra, (c) iterativno. U sluajevima (b) i (c) voditi rauna o efikasnosti reenja.
MODULE Recurrent7; FROM InOut IMPORT WriteString, WriteLn, ReadInt, WriteInt; CONST granica = 35; PROCEDURE FRec1(n: INTEGER): INTEGER; BEGIN IF n = 0 THEN RETURN 3 ELSIF n = 1 THEN RETURN 2 ELSIF n = 2 THEN RETURN 1 ELSIF n MOD 3 = 2 THEN RETURN -FRec1(n-1) + FRec1(n-2) - 2*FRec1(n-3) ELSIF n MOD 3 = 1 THEN RETURN 2*FRec1(n-2) - 3*FRec1(n-3) ELSE RETURN FRec1(n-1) + FRec1(n-3) END END FRec1; PROCEDURE FRec2(n: INTEGER): INTEGER; PROCEDURE F(f2, f1, f0, i, n: INTEGER): INTEGER; BEGIN IF i > n THEN RETURN f2 ELSIF i MOD 3 = 2 THEN RETURN F(-f2+f1-2*f0, f2, f1, i+1, n) ELSIF i MOD 3 = 1 THEN RETURN F(2*f1-3*f0, f2, f1, i+1, n) ELSE RETURN F(f2+f0, f2, f1, i+1, n) END END F; BEGIN IF n = 0 THEN RETURN 3 ELSIF n = 1 THEN RETURN 2 ELSIF n = 2 THEN RETURN 1 ELSE RETURN F(1, 2, 3, 3, n) END END FRec2;

PROCEDURE FIter(n: INTEGER): INTEGER; VAR f0, f1, f2, fn: INTEGER; i: INTEGER; BEGIN f0 := 3; f1 := 2; f2 := 1; IF n = 0 THEN fn := f0 ELSIF n = 1 THEN fn := f1 ELSIF n = 2 THEN fn := f2 ELSE FOR i := 3 TO n DO IF i MOD 3 = 2 THEN fn := -f2 + f1 - 2*f0 ELSIF i MOD 3 = 1 THEN fn := 2*f1 - 3*f0 ELSE fn := f2 + f0 END; f0 := f1; f1 := f2; f2 := fn END END; RETURN fn END FIter; VAR n: INTEGER; BEGIN WriteLn; WriteString('Unesite n (0 <= n <= '); WriteInt(granica, 0); WriteString('): '); ReadInt(n); IF (0 <= n) AND (n <= granica) THEN WriteString('FRec1(n) = '); WriteInt(FRec1(n), 0); WriteLn; WriteString('FRec2(n) = '); WriteInt(FRec2(n), 0); WriteLn; WriteString('FIter(n) = '); WriteInt(FIter(n), 0) ELSE WriteString('n je van dozvoljenih granica'); END END Recurrent7.

8. Napisati program koji za dati ceo broj n, 1 n 40, ispisuje vrednost elementa rekurentnog niza fn. Niz je definisan na sledei nain: fn = 2 + fn-1 / gn-2, n 2 gn = 1 + gn-1 / fn-2, n 2 f1 = 1, f0 = 2, g1 = 2, g0 = 1 Element fn izraunati: (a) rekurzivno preko definicije, (b) rekurzivno pomou akumulirajueg parametra, (c) iterativno. U sluajevima (b) i (c) voditi rauna o efikasnosti reenja.
MODULE Recurrent8; FROM InOut IMPORT WriteString, WriteLn, ReadInt, WriteInt; FROM RealInOut IMPORT WriteReal; CONST granica = 40; PROCEDURE GRec1(n: INTEGER): REAL; FORWARD; PROCEDURE FRec1(n: INTEGER): REAL; BEGIN IF n = 0 THEN RETURN 2.0 ELSIF n = 1 THEN RETURN 1.0 ELSE RETURN 2.0 + FRec1(n-1) / GRec1(n-2) END END FRec1; PROCEDURE GRec1(n: INTEGER): REAL; BEGIN IF n = 0 THEN RETURN 1.0 ELSIF n = 1 THEN RETURN 2.0 ELSE RETURN 1.0 + GRec1(n-1) / FRec1(n-2) END END GRec1; PROCEDURE FRec2(n: INTEGER): REAL; PROCEDURE FG(f1, f0, g1, g0: REAL; i: INTEGER): REAL; BEGIN IF i > n THEN RETURN f1 ELSE RETURN FG(2.0+f1/g0, f1, 1.0+g1/f0, g1, i+1) END END FG; BEGIN IF n = 0 THEN RETURN 2.0 ELSIF n = 1 THEN RETURN 1.0 ELSE RETURN FG(1.0, 2.0, 2.0, 1.0, 2) END END FRec2;

PROCEDURE FIter(n: INTEGER): REAL; VAR f0, f1, fn, g0, g1, gn: REAL; i: INTEGER; BEGIN f0 := 2.0; f1 := 1.0; g0 := 1.0; g1 := 2.0; IF n = 0 THEN fn := f0 ELSIF n = 1 THEN fn := f1 ELSE FOR i := 2 TO n DO fn := 2.0 + f1 / g0; gn := 1.0 +g1 / f0; f0 := f1; f1 := fn; g0 := g1; g1 := gn END END; RETURN fn END FIter; VAR n: INTEGER; BEGIN WriteLn; WriteString('Unesite n (1 <= n <= '); WriteInt(granica, 0); WriteString('): '); ReadInt(n); IF (0 <= n) AND (n <= granica) THEN WriteString('FRec1(n) = '); WriteReal(FRec1(n), 5); WriteLn; WriteString('FRec2(n) = '); WriteReal(FRec2(n), 5); WriteLn; WriteString('FIter(n) = '); WriteReal(FIter(n), 5) ELSE WriteString('n je van dozvoljenih granica'); END END Recurrent8.

9. Napisati program koji za dati ceo broj n, 0 n 25, ispisuje vrednost elementa rekurentnog niza fn. Niz je definisan na sledei nain: fn = 2 fn-1 / gn-2 + fn-2 / gn-3, n 3, n je parno fn = gn-1 / fn-2 + 2gn-2 / fn-3, n 3, n je neparno gn = gn-1 / fn-1 + gn-2 / fn-2 + gn-3 / fn-3, n 3 f2 = 1, f1 = 3, f0 = 1 g2 = 2, g1 = 2, g0 = 2 Element fn izraunati: (a) rekurzivno preko definicije, (b) rekurzivno pomou akumulirajueg parametra, (c) iterativno. U sluajevima (b) i (c) voditi rauna o efikasnosti reenja.
MODULE Recurrent9; FROM InOut IMPORT WriteString, WriteLn, ReadInt, WriteInt; FROM RealInOut IMPORT WriteReal; CONST granica = 25; PROCEDURE GRec1(n: INTEGER): REAL; FORWARD; PROCEDURE FRec1(n: INTEGER): REAL; BEGIN IF (n = 0) OR (n = 2) THEN RETURN 1.0 ELSIF n = 1 THEN RETURN 3.0 ELSIF ODD(n) THEN RETURN GRec1(n-1) / FRec1(n-2) + 2.0 * GRec1(n-2) / FRec1(n-3) ELSE RETURN 2.0 * FRec1(n-1) / GRec1(n-2) + FRec1(n-2) / GRec1(n-3) END END FRec1; PROCEDURE GRec1(n: INTEGER): REAL; BEGIN IF n <= 2 THEN RETURN 2.0 ELSE RETURN GRec1(n-1) / FRec1(n-1) + GRec1(n-2) / FRec1(n-2) + GRec1(n-3) / FRec1(n-3) END END GRec1; PROCEDURE FRec2(n: INTEGER): REAL; PROCEDURE FG(f2, f1, f0, g2, g1, g0: REAL; i: INTEGER): REAL; BEGIN IF i > n THEN RETURN f2 ELSIF ODD(i) THEN RETURN FG(g2/f1+2.0*g1/f0, f2, f1, g2/f2+g1/f1+g0/f0, g2, g1, i+1) ELSE RETURN FG(2.0*f2/g1+f1/g0, f2, f1, g2/f2+g1/f1+g0/f0, g2, g1, i+1) END END FG; BEGIN IF (n = 0) OR (n = 2) THEN RETURN 1.0 ELSIF n = 1 THEN RETURN 3.0 ELSE RETURN FG(1.0, 3.0, 1.0, 2.0, 2.0, 2.0, 3) END END FRec2;

PROCEDURE FIter(n: INTEGER): REAL; VAR f0, f1, f2, fn, g0, g1, g2, gn: REAL; i: INTEGER; BEGIN f0 := 1.0; f1 := 3.0; f2 := 1.0; g0 := 2.0; g1 := 2.0; g2 := 2.0; IF n = 0 THEN fn := f0 ELSIF n = 1 THEN fn := f1 ELSIF n = 2 THEN fn := f2 ELSE FOR i := 3 TO n DO IF ODD(i) THEN fn := g2/f1+2.0*g1/f0; gn := g2/f2+g1/f1+g0/f0 ELSE fn := 2.0*f2/g1+f1/g0; gn := g2/f2+g1/f1+g0/f0 END; f0 := f1; f1 := f2; f2 := fn; g0 := g1; g1 := g2; g2 := gn END END; RETURN fn END FIter; VAR n: INTEGER; BEGIN WriteLn; WriteString('Unesite n (1 <= n <= '); WriteInt(granica, 0); WriteString('): '); ReadInt(n); IF (0 <= n) AND (n <= granica) THEN WriteString('FRec1(n) = '); WriteReal(FRec1(n), 5); WriteLn; WriteString('FRec2(n) = '); WriteReal(FRec2(n), 5); WriteLn; WriteString('FIter(n) = '); WriteReal(FIter(n), 5) ELSE WriteString('n je van dozvoljenih granica'); END END Recurrent9.

10. Napisati program koji za dati ceo broj n, 0 n 40, ispisuje vrednost elementa rekurentnog niza fn. Niz je definisan na sledei nain: fn = fn-1 + gn-2, n 2, poslednja cifra broja n je 5 fn = fn-2 gn-1, n 2, poslednja cifra broja n je < 5 gn = gn-1 2 fn-2, n 2, n je neparno gn = gn-2 + 2 fn-1, n 2, n je parno f1 = 0, f0 = 1, g1 = 1, g0 = 0 Element fn izraunati: (a) rekurzivno preko definicije, (b) rekurzivno pomou akumulirajueg parametra, (c) iterativno. U sluajevima (b) i (c) voditi rauna o efikasnosti reenja.
MODULE Recurrent10; FROM InOut IMPORT WriteString, WriteLn, ReadInt, WriteInt; CONST granica = 40; PROCEDURE GRec1(n: INTEGER): INTEGER; FORWARD; PROCEDURE FRec1(n: INTEGER): INTEGER; BEGIN IF n <= 1 THEN RETURN n-1 ELSIF n MOD 10 >= 5 THEN RETURN FRec1(n-1) + GRec1(n-2) ELSE RETURN FRec1(n-2) - GRec1(n-1) END END FRec1; PROCEDURE GRec1(n: INTEGER): INTEGER; BEGIN IF n <= 1 THEN RETURN n ELSIF ODD(n) THEN RETURN GRec1(n-1) - 2*FRec1(n-2) ELSE RETURN GRec1(n-2) + 2*FRec1(n-1) END END GRec1; PROCEDURE FRec2(n: INTEGER): INTEGER; PROCEDURE FG(f1, f0, g1, g0, i: INTEGER): INTEGER; VAR fn, gn: INTEGER; BEGIN IF i > n THEN RETURN f1 ELSE IF i MOD 10 >= 5 THEN fn := f1 + g0 ELSE fn := f0 - g1 END; IF ODD(i) THEN gn := g1 - 2*f0 ELSE gn := g0 + 2*f1 END; RETURN FG(fn, f1, gn, g1, i+1) END END FG; BEGIN IF n <= 1 THEN RETURN n-1 ELSE RETURN FG(0, -1, 1, 0, 2) END END FRec2;

PROCEDURE FIter(n: INTEGER): INTEGER; VAR f0, f1, fn, g0, g1, gn: INTEGER; i: INTEGER; BEGIN IF n <= 1 THEN fn := n-1 ELSE f0 := -1; f1 := 0; g0 := 0; g1 := 1; FOR i := 2 TO n DO IF i MOD 10 >= 5 THEN fn := f1 + g0 ELSE fn := f0 - g1 END; IF ODD(i) THEN gn := g1 - 2*f0 ELSE gn := g0 + 2*f1 END; f0 := f1; f1 := fn; g0 := g1; g1 := gn END END; RETURN fn END FIter; VAR n: INTEGER; BEGIN WriteLn; WriteString('Unesite n (0 <= n <= '); WriteInt(granica, 0); WriteString('): '); ReadInt(n); IF (0 <= n) AND (n <= granica) THEN WriteString('FRec1(n) = '); WriteInt(FRec1(n), 0); WriteLn; WriteString('FRec2(n) = '); WriteInt(FRec2(n), 0); WriteLn; WriteString('FIter(n) = '); WriteInt(FIter(n), 0) ELSE WriteString('n je van dozvoljenih granica'); END END Recurrent10.

You might also like