3.3. Funkcije

Mogućnost definiranja novih funkcija je osnovna stepenica k naprednijem programiranju. Trebati ćemo razlikovati dvije vrste funkcija:

  1. Simboličke funkcije
  2. Python funkcije

Ugrubo, simbolička funkcija dopušta više simboličkih manipulacija (poput integracije ili deriviranja), ali ne može sadržavati kompleksne algoritme već samo jednostavne izraze [1]. Python funkcija može biti proizvoljno kompleksna, ali ne može se uvijek npr. simbolički integrirati.

3.3.1. Simboličke funkcije

Simboličke funkcije se definiraju na slijedeći prirodan način:

sage: f(x) = x^2
sage: f
x |--> x^2

S njima se mogu raditi sve uobičajene operacije:

sage: f(2)
4
sage: f((2*x+3)^2)
(2*x + 3)^4
sage: diff(f(x), x)  # simboličko diferenciranje, vidi slijedeće poglavlje
2*x
sage: type(sin)
<class 'sage.functions.trig.Function_sin'>
sage: type(f)
<type 'sage.symbolic.expression.Expression'>

Naravno, funkcija može biti i funkcija od više variabli:

sage: g(x, a) = x^a
sage: g(4, 2)
16

3.3.2. Python funkcije

Python funkcije se definiraju korištenjem ključnih riječi def i return, te blokova kôda koji su konzistentno uvučeni

sage: def h(x):
....:     "Kvadriraj broj x."
....:     return x^2
sage: print h(3)
9

Kao prvi red tijela funkcije može se, kao gore, staviti dokumentacijski string (tzv. docstring ) kojem se kasnije može pristupiti standardnim metodama pristupa dokumentaciji. (Dakle, h? će ispisati dokumentacijski string.)

Funkcija može imati i opcionalne argumente s defaultnom vrijednošću:

sage: def fun(x, n=1, b=0):
....:     return x^n + b
sage: fun(3, 4, 5)
86
sage: fun(3, b=5, n=4)
86
sage: fun(3)
3

(Uočite da kad smo eksplicitno imenovali argumente nismo morali paziti na njihov poredak.)

Bilo što može biti argument funkcije. Najmoćnija stvar, obilato korištena u funkcionalnom pristupu programiranju, je da i same funkcije mogu biti argumenti funkcija:

sage: def gun(f, x):
....:     "Komponiraj dvaput funkciju sa samom sobom"
....:     return f(f(x))
sage: print gun(sin, 2)
sin(sin(2))
sage: gun(log, 0.1)
0.834032445247956 + 3.14159265358979*I

Zadatak 1

Isprogramirajte funkciju fibProc(n) koja računa n-ti član Fibonaccijevog niza (niz kod kojeg je svaki član definiran kao zbroj prethodna dva, a javlja se pri analizi idealizirane populacije zečeva).

Zadatak 2

Isprogramirajte funkciju fibBinet(n) koja računa n-ti član Fibonaccijevog niza putem Binetove formule

\[F_n = \frac{\varphi^n - \cos(n\pi)\varphi^{-n}}{\sqrt{5}}\]

gdje je \(\varphi\) tzv. zlatni omjer (golden_ratio). Uvjerite se da dobivate dobre vrijednosti za neke n.

Footnotes

[1]Formalno, simboličke funkcije nisu po svom tipu “funkcije”, već “simbolički izrazi koji se mogu pozivati” (“callable symbolic expression”): Za detalje razlika između simboličkih i Python funkcija vidi ovdje)

Pregled sadržaja

Prijašnja tema

3.2. Kontrola toka izvršavanja

Slijedeća tema

3.4. Crtanje grafova