# Programiranje 1

Predmet _Programiranje 1_ je sestavljen iz treh delov, ki se bodo prepletali med sabo.

V prvem delu se bomo osredotočili na _funkcijsko programiranje_, ki je bolj matematičen pristop k pisanju programov, osnovan na sestavljanju funkcij in njihovi uporabi na vrednostih. Nasproten pristop bi bilo na primer _imperativno programiranje_, v katerem programe pišemo kot zaporedja ukazov, ki spreminjajo stanje računalnika. Programi, napisani v funkcijskem stilu, so dostikrat krajši in preglednejši, poleg tega pa preprosteje omogočajo porazdeljeno računanje. Zaradi vseh teh lastnosti veliko modernih programskih jezikov vpeljuje ideje iz funkcijskega programiranja. Tudi zato ste že pri predmetu _Uvod v programiranje_ poleg imperativnega programiranja prek zank in spremenljivk (in seveda objektnega programiranja) spoznali tudi nekaj funkcijskih idej. Na primer rekurziji ste dali večji poudarek, kot bi ga v običajnih začetniških tečajih programiranja.

V drugem delu bomo spoznali _dokazovalnike_ oziroma _dokazovalne pomočnike_, torej računalniške programe, ki nam pomagajo pri pisanju in preverjanju matematičnih dokazov. Dokazovalniki so tesno povezani s funkcijskim programiranjem. Po eni strani dokazovalniki gradijo na tipih, ki so eden od temeljev funkcijskega programiranja, po drugi strani pa z njimi najenostavneje dokazujemo ravno lastnosti funkcijskih programov.

V zadnjem delu pa bomo spoznali osnove podatkovnih struktur in algoritmov, tako v kontekstu funkcijskega programiranja kot izven. Nekaj splošnih _podatkovnih struktur_ že poznamo, na primer sezname. Včasih pa so naše želje bolj specifične, zato lahko uporabimo bolj specializirane strukture, ki so učinkovitejše. Podobno poznamo že nekaj algoritmov, na primer Evklidovega ali pa iskanje z bisekcijo v urejenem seznamu. Vseeno pa obstaja nabor klasičnih algoritmov ter pristopov k reševanju problemov, ki jih mora poznati vsak programer.
