Funkcija (programiranje)

**Funkcija** je izdvojena programska cjelina (potprogram) čiji je zadatak da na osnovu određenog algoritma transformiše određene podatke (*parametre*, *argumente*) u novi podatak koji se naziva *rezultat funkcije*. Parametri, odnosno argumenti se još nazivaju i ulazni podaci, a sam rezultat funkcije njenim izlaznim podatkom. Sami podaci mogu biti različite prirode, kao što je broj, tekst, slika, zvuk itd.

## Korisnost
Korisnost funkcija u programiranju je višestruka. Najprije, funkcije se koriste da razdvoje programski kod u različite cjeline da bi se lakše manipulisalo logikom programa. Takođe, na ovaj način se postiže izolacija problema - ako funkcija svoj zadatak provjereno radi dobro, problem koji postoji u programu se neće tražiti na ovom dijelu. Zbog toga funkcija treba da radi uvijek samo jedan određen zadatak, jasno definisan i sa minimalno (ili nimalo) vanjskih efekata. Od ostalih korisnih efekata funkcija tj. "razbijanja" programa u funkcije izdvajamo i sljedeće:
* ponovno korištenje istog programskog koda u drugim programima
* izbjegavanje dupliranja istog koda u programu
* povećana čitljivost kompletnog koda

## Sastav funkcije
Funkcija se sastoji, u velikoj većini programskih jezika, od nekoliko osnovnih dijelova:
* ime funkcije
* definicija ulaznih podataka (argumenata)
* definicija izlaznog podatka (rezultata)
* tijelo funkcije

U različitim programskim jezicima ovaj sastav se razlikuje manje ili više, u skladu sa prirodom datog programskog jezika. Npr. PHP-a u svojoj formalnoj definiciji funkcije nema definiciju izlaznog podatka, iako ta ista funkcija može da ima rezultat.

## Podjela
U programiranju, najčešća podjela na koju nailazimo je između *funkcija* i *procedura*. Pod procedurom se podrazumijeva specijalni vid funkcije koja se od funkcija razlikuje samo za to što nema izlaznu vrijednost ili, koristeći programerski žargon, *ne vraća* nikakvu vrijednost odnosno podatak. U različitim programskim jezicima pojavljuju se još i nazivi poput *metoda* (kojim se nazivaju funkcije koje pripadaju nekom objektu, tj. klasi), potprogram, rutina (sinonim za proceduru), itd.

## Primjeri u programskom jeziku C

```c
void f()
{}
```

Ovde je predstavljena funkcija koja ne vraća rezultat, ne uzima nijedan ulazni podatak i tijelo funkcije joj je prazno. U C-u se koristi ključna riječ void prije imena funkcije da bi se naznačilo da funkcija nema izlazni podatak. Prostor između otvorene vitičaste i zatvorene vitičaste zagrade se koristi da bi se definisao algoritam po kojem funkcija radi, a otvorena i zatvorena zagrada sa desne strane naziva funkcije služi za definisanje ulaznih parametara, kao što ćemo vidjeti u narednom primjeru.


```c
int saberi(int a, int b )
{
    int c;
    c = a + b;
    return c;
}
```

Funkcija saberi prihvata dva cijela broja (a i b) i vraća kao rezultat zbir ova dva. Ovaj put u definiciji funkcije vidimo da ona vraća cio broj, baš kao što su joj i argumenti cijeli brojevi, a između vitičastih zagrada vidimo programski kod koji implementira sabiranje. Još jedan aspekat je vidljiv iz ovog komada koda, a to je postojanje lokalnih promjenjivih - funkcija može predstavljati nove podatke unutar tijela funkcije i njihovo trajanje je određeno trajanjem rada funkcije. Na kraju vidimo ključnu riječ return koja služi da prekine funkciju i, u ovom slučaju, definiše rezultat funkcije.


```c
void saberi(int a, int b, int * c )
{
    *c = a + b;
}
```

Druga verzija funkcije saberi koristi pokazivače kao sredstvo postizanja vanjskih efekata, i koja u našem primjeru zamjenjuje formalni rezultat funkcije, tj. korištenje ključne riječi return. Podatak koji je poslat funkciji kao pokazivač, ili striktnije govoreći, čija je adresa poslata funkciji kao ulazni parametar, je dostupan funkciji na mijenjanje i to je još jedan način za dobijanje povratnih informacija od funkcije. Taj način se najčešće koristi kada nam umjesto jednog rezultata treba više njih, a dotični programski jezik to ne podržava.

## Rekurzija
*Poseban članak: [[rekurzija]]*

Rekurzija je pojam koji označava situaciju kada jedna funkcija u svom tijelu vrši poziv iste te funkcije. Većina programskih jezika podržava rekurziju i ona se koristi najčešće u situacijama kada se implementira određeni algoritam koji je i u matematici definisan rekurzivno. Tipičan primjer je funkcija za izračunavanja faktorijela prirodnog broja i koja se u matematici definiše na sljedeći način:


    n! = \left \{ \begin{matrix} 1, & n=0 \\ n \times (n-1)!, & n>0 \end{matrix} \right. 


Odgovarajuća funkcija u potpunosti odgovara zadatoj definiciji:

```c
int faktorijel(int n )
{
     if (n == 0 )
         return 1;
     else
         return n*faktorijel(n-1);
}
```