You are on page 1of 9

REKURZIJA, primjeri...

Niz brojeva definiran je rekurzivno na slijedeći način:


fn = n + 1 , za n <= 1
fn = (fn-1 + 1)* fn-2 , za n > 1.
Napisati rekurzivnu funkciju koja će izračunati n-ti član niza. Odrediti apriornu složenost funkcije!

long f(int n)
{
if( n < 2 )
return (n+1);

return ( f(n-1) + 1 ) * f(n-2);


}
O(2n )

// POTENCIJE; //
long pot(long x, long y)
{
if(y <= 0)
return 1;

return x * pot(x, y-1);


}

// ARITMETIČKI NIZ; //
int aNiz(int a0, int d, int n)
{
if( n == 0 )
return a0;

return d + aNiz(a0, d, n-1);


}

// FAKTORIJELE; //
int faktorijele(int n)
{
if(n <= 1)
return 1;

return n * faktorijele(n - 1);


}
// ISPIS od 1 do 10 uzlazno (na 2 načina); //
void ispis1(int n1, int n2)
{
if(n1 <=n2)
{
ispis1(n1, n2-1);
printf("%d\n"n2);
}
}
void ispis2(int n1, int n2)
{
if(n1 <= n2)
{
printf("%d\n",n1);
ispis2(n1+1, n2);
}
}

// ISPIS od 1 do 10 silazno (na 2 načina); //


void ispis1(int n1, int n2)
{
if(n1 <= n2)
{
ispis1(n1+1,n2);
printf("%d\n",n1);
}
}

void ispis2(int n1, int n2)


{
if(n1 <= n2)
{
printf("%d\n",n2);
ispis2(n1, n2-1);
}
}

Napisati rekurzivnu funkciju koja će prvo silazno, pa uzlazno ispisati brojeve od 1 do n:

float ispis(int n)
{
if( n >= 1 )
{
printf("%d\n",n);
ispis(n-1);
printf("%d\n",n);
}
return 0.00
}
Niz brojeva definiran je rekurzivno na slijedeći način:
f 0 = 1,
f 1 = 2,
f 2 = 3,

f n = (f n-1 + f n-2)* f n-3 , za n > 2.


Napisati rekurzivnu funkciju koja će izračunati n-ti član niza. Odrediti apriornu složenost funkcije.
Funkcija mora imati prototip: long f(int n);

long f(int n)
{
if( n <= 2 )
return (n+1);

return ( f(n-1) + f(n-2) ) * f(n-3);


}

O(3n )

Napisati rekurzivnu funkciju koja će izračunati umnožak dva broja a i b koristeći se samo
operacijom zbrajanja. Odrediti apriornu složenost funkcije. Funkcija mora imati prototip:

int puta(int a, int b);

int puta(int a, int b)


{
if( b == 0 )
return 0;

return a + puta( a, b -1 );
}
O(1n ) ****O(1)

Napisati rekurzivnu funkciju koja izračunava umnožak znamenki zadanog broja 
(n.pr. uz(329)=3*2*9=54). Koristiti operatore cjelobrojnog dijeljenja integera (/) i modulo operator
(%). Prototip funkcije je:

int uz (int a)

int uz(int a)
{
int b = a%10;

if( a/10 == 0 )
return a;

return b * uz( a/10 );


}
Napisati rekurzivnu funkciju koja će vratiti indeks najvećeg člana polja A[ ] koje ima n članova.
Prototip funkcije je:

int maxclan (int A[], int i, int n);

int maxclan (int A[], int i, int n)


{
int imax;

if( i >= n-1 )


return n-1;

imax = maxclan(A, i+1, n);


if( A[i] > A[imax]) // da je trebao indeks najmanjeg ( < )
return i;

return imax;
}

Napisati rekurzivnu funkciju koja izračunava najveću zajedničku mjeru dva broja. Koristiti
Euklidov algoritam koji kaže da je za dva broja, a i b, najveća zajednička mjera a ako je b = 0, a
inače je to najveća zajednička mjera od b i ostatka dijeljenja a sa b. Prototip funkcije je:

int euklid(int a, int b)


{
if( b == 0 )
return a;

return euklid(b, a%b);


}

Jednostruko povezana lista u memoriji sadrži statističke podatke o svim dosadašnjim nastupima
jednog tenisača na turnirima. Element liste sadrži šifru turnira (int) i broj pobjeda na tom turniru
(int). Napisati rekurzivnu funkciju koja će vratiti ukupan broj pobjeda tog tenisača na svim
turnirima.

typedef struct s
{
int sifraTurnira;
int brPob;
struct s *sljed;
} cvor;

int broj_pobjeda(cvor *glava)


{
if( glava == NULL ) return 0;
return glava->brPob + broj_pobjeda( glava->sljed );
}
U jednostruko povezanu listu spremaju se podaci o tvrtkama. Svaki zapis sadrži matični broj
tvrtke (long), naziv tvrtke (40+1 znak), broj žiro računa (20+1 znak) i telefonski broj osobe za
kontakt (15+1 znak). Lista NIJE sortirana. Napisati REKURZIVNU funkciju koja će pronaći
tvrtku sa zadanim matičnim brojem u listi. Ako ta tvrtka postoji, funkcija vraća pokazivač na
odgovarajući zapis, u protivnom funkcija vraća NULL. Definirati strukture potrebne za rješenje
zadatka i odrediti apriornu složenost funkcije. Funkcija mora imati prototip:

zapis *nadji(zapis *glava, long mbr);

struct s{
long matBroj;
char naziv[40+1];
char brZiroRacun[20+1];
char telKontakt[15+1];
struct s *sljed;
};
typedef struct s zapis;

zapis *nadji(zapis *glava, long mbr)


{
if( glava != NULL)
{
if( glava->matBroj == mbr )
return glava;

else
return nadji( glava->sljed, mbr );
}
else
return NULL;
}

Napisati rekurzivnu funkciju koja zadani niz znakova ispisuje unatrag (npr. ako je zadan niz
“Abeceda”, funkcija treba ispisati “adecebA”). Funkcija treba imati prototip:

void ispisi_unatrag(char *niz);

void ispisi_unatrag(char *niz)


{
if( *niz == NULL ) return ;

ispisi_unatrag(niz+1);
printf("%c\n",*niz);
}
Kakva je apriorna složenost i što će ispisati sljedeća funkcija ako njen poziv glasi:

pisi(5); // poziv funkcije pisi //


void pisi(int broj)
{
broj--;
if (broj<0) return;
pisi (broj);
printf ("%d",broj);
}
O(1)
Ispis =====> 01234

Napisati rekurzivnu funkciju koja će izračunati istu sumu reda kao i zadana funkcija f:

double f(int n)
{
double suma = 0;
int i;
for (i = 1; i < n; i++)
suma += 1./(i * (i + 1) * (i + 2));
return suma;
}

Rješenje:

double f(int n)
{
--n;
if (n<1) return 0;
return 1./(n*(n+1)*(n+2)) + f(n);
}

ili
double f(int n)
{
if (n<=1) return 0;
return 1./((n-1)*(n)*(n+1)) + f(n-1);
}
složenost: O(n)
Napisat rekurzivnu funkciju koja traži studenta sa zadanim matičnim brojem kroz
jednostruko povezanu listu. Prototip funkcije je:

void traziStudenta(cvor *glava, int matBroj);

void traziStudenta(cvor *glava, int matBroj)


{
if( glava == NULL)
{
printf("Nema!\n");
return;
}
if( glava->mbr == matBroj )
{
printf("%d %c",glava->mbr, glava->spol);
return;
}
traziStudenta(glava->sljed, matBroj);
}

Napisati rekurzivnu funkciju koja će odrediti koji se znak u nekom sortiranom znakovnom
polju dimenzije n+1 najčešće pojavljuje. Izlazni argument je nađeni znak, a funkcija vraća broj
pojavljivanja tog znaka. Prototip funkcije je:

int mode (char *tekst, int n, char *znak)


{
char tmp;
int i=1;
int rek;

tmp = tekst[n];
while (tekst[n-i]== tmp)
i++;
rek = mode (tekst, n-i, znak);
if (rek > i)
return rek;
else
{
*znak=i;
return i;
}
}
Napisat rekurzivnu funkciju koja će obaviti operaciju cijelobrojnog dijeljenja integera a i b
koristeći se samo operacijom oduzimanja. Prototip fuckcije je:

int podijeli(int a, int b);

int podijeli(int a, int b)


{
if( b > a )
return 0;

return 1 + podijeli(a-b, b);


}

Napisat rekurzivnu funkciju koja će obaviti operaciju modulo – ostatka cijelobrojnog


dijeljenja (%) integera a sa integerom b koristeći se samo operacinom oduzimanja. Prototip
funkcije je:

int modulo(int a, int b);

int modulo(int a, int b)


{
if( b > a )
return a;

return modulo(a-b, b);


}
??????????????????????????????????????????????????????????????????

1.) Napisati rekurzivnu funkciju koja će za realni broj x (|x| < 1) izračunati sumu reda:

x3 x5 x7 x 2 n 1
Ar th( x )  x     
3 5 7 ( 2n  1)

Funkciji se kao jedan od argumenata predaje broj n koji služi kao uvjet zaustavljanja.

2.) Napisati rekurzivnu funkciju koja će prvo uzlazno a zatim silazno ispisati n članova
aritmetičkog niza s bazom a i udaljenošću članova d (a0 = a , an = a(n+1) +d).

float niz (int n, float b, float d)

3.) Napisati rekurzivnu funkciju za izračunavanje sume geometrijskog reda od n članova,


n

 aq
j 0
j

Prototip funkcije je:


float SumaGeometrijskogReda (float a, float q, int n);

Kolika je apriorna složenost te funkcije?

????????????????????????????????????????????????????????????????????????????????????????

You might also like