7. predavanje
|
Proceduralno programiranje - funkcionalno programiranje
Proceduralno programiranje: prati se transformacija podataka od ulaznih podataka do konačnog rezultata.
Funkcionalno programiranje: transformiraju se funkcije tako da transformirane funkcije od polaznih podataka daju konačan rezultat.
|
U programu Mathematica "sve je funkcija"
Naredba FullForm ; Head izraza i elementi izraza
Mathematica svaki izraz koji korisnik napiše preformulira u funkcijski izraz tj. sve se prikazuje kao funkcija. Interni prikaz izraza možemo vidjeti pomoću funkcije FullForm.
Plus se zove Head izraza (glavni dio izraza), dok su a i b elementi izraza.
Times se zove Head (glavni dio) izraza dok su x i y elementi izraza.
List se zove Head izraza dok su 1 , a, 6 i Sin[5] elementi izraza.
Osnovni elementi funkcionalnog programiranja
Budući svaki izraz Mathematica interno prikazuje kao funkciju koja ima svoje glavni dio (Head) i svoje elemente to je jasno da su osnovne opreacije nad takvim izrazom one koje
mijenjaju glavni dio izraza - funkcija Apply
mijenjaju elemente izraza - funkcija Map
|
Promjena glavnog dijela izraza (promjena Head-a)
Sintaksa i semantika
Glavni dio izraza mijenjamo funkcijom Apply. Sintaksa je
Apply[f, izraz]
a rezultat je novi izraz kojem je glavni dio zamijenjen s f.
Drugi način pisanja je:
f @@ izraz
Primjeri
Zbrajanje i množenje članova liste
Apply s argumentom Plus se može primjeniti na bilo koji Head:
|
Promijena elemenata izraza
Sintaksa i semantika
Elemente izraza mijenjamo funkcijom Map. Važno: Head izraza se ne mijenja. Način upotrebe je
Map[f, izraz]
Rezultat je novi izraz koji ima isti glavni dio kao i polazni i na sve elemente je primjenjena funkcija f.
Drugi način pisanja je:
f /@ izraz
Primjer
Primjer
Odredite duljinu svake od podlista liste {{1,2},{3,4,5},{6,7,8,9}}.
Upotrijebiti ćemo funkciju Length[lista] koja vraća duljinu liste. Točnije, funkcija Length[izraz] vraća broj elementa izraza na koji je primjenjena.
|
Anonimne funkcije (anonymous functions)
Anonimne funkcije se obično definiraja onda kada nam treba funkcija koju ćemo koristiti u tom trenutku i neće nam trebati kasnije.
Ne zadaje se ime takve funkcije.
Funkcija se zadaje samo formulom (bez imena).
Ako se radi o funkciji jedne varijable tada ta varijabla obavezno ima ime #. Ukoliko se radi o funkcije više varijabli te varijable se zovu #1, #2, #3,...
Kraj formule se, obavezno, označava znakom &.
Primjeri anonimnih fukcija
Uobičajna definicija funkcije koja kvadrira svoj argument je
i koristimo je na uobičajan način:
Ista funkcija definirana kao anonymous function je (na navodi se ime samo formula) je izraz
a upotrebljava se ovako
Daljnji primjeri anonymous functions
Funkcija
primjenjena na argument 2:
Funkcija Cos(2x+π) primjenjena na argument 1.2:
Funkcija
primjenjena na točku domene (2.1; 3.4):
|
Daljnji primjeri djelovanja na elemente izraza
Primjer
Zadana je lista listi {{0,1,2},{3,4,5},{6,7,8,9}}. Izdvojite druge elemente svake od podlisti.
Kao što je poznato i-ti element liste dobije se pomoću lista[[i]].
Primjer
Dodajte nulu na kraj svake od podlisti liste {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}.
Dodajte nulu na početak svake od podlisti.
Koristiti ćemo funkciju Append[lista, element] koja element dodaje na kraj liste i funkciju Prepend[lista, element] koja element dodaje na početak liste.
Primjer
Dodajte nulu na početak i na kraj svako od podlisti liste {{1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11, 12}}.
|
Kombiniranje Apply i Map
Primjer
Napišite izraz koji će davati srednju vrijednost svakog retka matrice.
Za ilustraciju ćemo koristiti slučajnu matricu tipa (5, 5) generiranu od brojeva 0 i 1 te ćemo izračunati srednju vrijednost svakog retka.
Primjer
Za podatke u listi {3.1, 4.2, 5.6, 4.1, 6.7} odredite srednju vrijednost i standardnu devijaciju podataka.
Znamo: srednja vrijednost je
∑
a standardna devijacija je
=
|
Iteracije, funkcija Nest
Funkcija Nest
Nest[f, izraz, n]
funkcija f se primjeni na zadani izraz n puta.
Primjeri
Funkcija Framed[izraz] vraća uokvireni izraz.
U slijedećim primjerima ćemo koristiti činjenicu (bez dokaza) da niz
konvergira prema
za razumno odabrani
(Newton).
Koliki je
Usporedimo rezultate iteracije s "točnom" vrijednošću.
Koliko je
Funkcija NestList
NestList[f, izraz, n]
daje listu rezultata kada se funkcija f primjeni na zadani izraz od 0 do n puta. Drugim riječima dobijemo sve međurezulate funkcije Nest.
Primjeri
|
Usporedba brzine izvođenja proceduralno i funkcionalno napisanog programa
Brzina izvođenja proceduralnog programa je znatno manja nego brzina ekvivalentnog funkcionalnog programa.
Primjer
Zadatak: provedimo 1,000,000 iteracija po slijedećoj formuli
![]()
proceduralno i funkcionalno i izmjerimo vrijeme izvođenja funkcijom Timing.
Funkcija Timing vraća listu od dva člana; prvi je izmjereno vrijeme a drugi je dobiveni rezultat.
U ovom primjeru je proceduralno napisan program sporiji približno 15 puta.
Primjer
Zadatak: Od poznate lista realnih brojeva treba dobiti umnožak sinusa elemenata liste.
Za ilustraciju postupka listu ćemo dobiti tako da 300 000 puta generiramo slučajan broj.
In[5]:=
In[7]:=
In[8]:=
In[9]:=
Out[9]=
U ovom primjeru je proceduralno napisan program sporiji približno 8 puta.
|