5. Függvények

Ezen az órán a függvényekkel, a rekurzióval és a debuggolással ismerkedtünk meg. Az órán írt kódok kommentekkel kiegészítve (és a 4. házi megoldása) a szokásos GitHub repository-ban érhető el:

https://github.com/Dawars/Trefort-Android-Szakkor/blob/master/src/Szakkor5Ora.java

Függvények

Ha egy kódrészletet többször szeretnénk használni, akkor érdemes függvényt használni. így a kód csak egy helyen fordul elő, könnyebb módosítani és átláthatóbb.

Vegyük a következő példát: Javaban nincsen külön művelet a hatványozásra, de mi sokszor szeretnénk ezt használni.

Először írjunk egy kódrészletet, ami kiszámolja a $latex base^n $ eredményét.

A hatványozás az a művelet, ahol a base -t n -szer összeszorozzuk. Pl:

double base = 2;
int n = 3;

//—————————-

double result = 1; // eredmény
for(int i = 0; i < n; i++)
    result = result * base;

//—————————-

System.out.println(result); // Kiírja, hogy 8

(Remélem) látjuk, hogy ezt felesleges és fárasztó lenne minden alkalommal kiírni.

Most ezt alakítsuk át egy egyszerű függvénnyé:

// a static kulcsszóról következő órán beszélünk, csak ezért raktam zárójelbe
  
/**
* Hatványozó függvény
*
* double base - hatványalap
* double n - hatványkitevő, hányszor szorozzuk össze a base-t
* @return base ^ n
*/
(static) double hatvanyozas(double base, int n){

    // kód
    double result = 1; // eredmény
    for(int i = 0; i < n; i++)
        result = result * base;

    return result; // a függvény eredménye, a visszatérési érték
}

Először vizsgáljuk meg az első sort. A double a visszatérési érték típusa, vagyis megmondja, hogy mit várunk a hatványozástól (egy valós számot várunk).

Nem minden esetben van visszatérési érték, ilyenkor ide void-ot írunk

Utána a függvény neve, hatvanyozas. Ezzel tudjuk később meghívni a függvényt.

Utána a zárójelekben vesszővel elválasztva fel vannak sorolva a paraméterek(bemenetek). Az eredeti kódban ezek konkrét számok voltak, amiket a base és az n változókban tároltunk.

Végül a {  } -ek közötti code block-ban található a kód, ami minden függvényhívásban lefut, majd a végén az eredmény a return sorba kerül visszaadásra.

Vegyük észre, hogy a függvénybe nem adtuk meg a konkrét értékeket, amit ki akarunk számolni, csak egy eljárást, hogy a base és n paraméterekből hogyan kapjuk meg az eredményt.

Most úgy tudjuk kiszámolni a $latex 2^3$-at, hogy meghívjuk a hatvanyozas nevű függvényünket:

double eredmeny = hatvanyozas(2, 3);

Ilyenkor a program “átugrik” a függvényünk elejére és sorban átadja a függvénynek a megadott paramétereket. Tehát a (2, 3)-at a (base, n)-nek. Majd a függvént végén (vagy a return hívásakor) a program visszaugrik a hívás helyére és visszatér a return-ba írt értékkel.

A futtatás után ha kiiratjuk az eredmeny változó értékét megkapjuk a 8-at. Próbálkozzunk a bemeneti értékek módosításával (2, 3) és figyeljük az eredményt.

Nézzük a teljes kódot:

/**
* Hatványozó függvény
*
* @param base - hatványalap
* @param n - hatványkitevő
* @return base ^ n = base * base … * base
*/
static double hatvany(double base, int n) {
    double res = 1;

    for (int i = 0; i < n; i++)
        res = res * base;

    return res;
}

// a main függvényben:
  
double eredmeny = hatvanyozas(2, 3);
  
System.out.println(eredmeny);
  

Rekurzió

Azt nevezzük rekurziónak, ha egy függvény meghívja önmagát. Erre az órán a faktoriáis példát vettük, a következő animáció a nagyon jól elmagyarázza a működését.

Recursion Animated Gif

A Fibonacci sorozat tagjai is így számolhatók (a kód Pythonbanvan írva, a feladat, hogy írjátok át Java-ba 🙂 )

A következő órán a Class-okat (ossztály) fogjuk venni, ami az Objektum Orientált Programozás (OOP) alapja. Addig is mindenkinek jó szünetet kívánok!