Rekurzív függvények
Előző programjaink kizárólag egy fordítási egységből (.adb kiterjesztésű fajlból) álltak. A most ismertetésre kerülő program már egy olyan működését mutat be, amely felhasznál egy másik fordítási egységben megírt függvényt is. (Természetesen a maximum kiválasztásos rendezés-nél alkalmazott beágyazást is használhattuk volna.) Ez itt egy példa egy másik sok esetben hasznos szemlélet bemutatására. Azzal, hogy külön fordítási egységekben dolgozunk nő a program újrafelhasználhatóságának, és tesztelhetőségének esélye, valamint az összetartozó részek külön fájlban történő megírása nagyban javítja az olvashatóságot, és a hatékony csapatmunkát is támogatja. (Ez a két dolog erősen összefügg különösen nagy rendszereknél.) A fájl nevének meg kell egyeznie a benne található programegység nevével!
A függvényünk, amit elkészítünk egy nagyon egyszerű rekurzív függvény lesz, azaz egy olyan függvény amely meghívja saját magát. Ez egy veszélyes programozási megoldás, és biztonságkritikus szoftvereknél a rekurzió egy kerülendő (nem alkalmazható) eszköz. Ennek a dinamikus memóriahasználat, és az ebből következő megjósolhatatlan működés az oka. Pl.: könnyen elfogyhat a memória. Másfelől a rekurzív programok hatékonyságukban is alulmaradnak az iteratív (ciklussal történő) megvalósításokkal szemben. Az, hogy egy ilyen függvénnyel kezdjük a függvények ismertetését, csak oktató jellegű, hiszen remekül mutatja a nyelv ezen lehetőségét, és magának a függvény fogalomnak a megértésében nem gátol. (Szeretnénk itt hivatkozni egy korábbi a függvényekről, és eljárásokról szóló cikkre.) A fentiek ellenére azért használjuk a rekurzív függvényeket, mert számos gyakori probléma megoldásának algoritmusa könnyen, átláthatóan és röviden leírható a rekurzió segítségével. pl.: fabejárások (Látunk majd példát erre is.)
Mostani példánkkal csupán a rekurzió elvének ismertetése a cél. A tényleges alkalmazások később jönnek. Egyelőre csak visszaszámolunk…
szamol.adb
szamol_teszt.adb
magyarázat:
A főprogram 14. sorában hívjuk meg a program elején (7.sor) a with segítségével elérhetővé tett szamol függvényt.