Miért ebben a sorrendben írj ki a számokat a függvény (Java)?
public static void callMe(int i) {
i--;
if (i > 0) {
callMe(i);
}
System.out.println(i);
}
i=5 -öt paraméterként átadva a kimenet ez lesz:
0
1
2
3
4
Miért nem 4-től 0-áig?
println előtt 4szer meghívja(amig 0 felett van az i értéke) önmagát, de utána a println miért kezdi el visszanövelni a számokat?
Ha meg minden függvényhívás a saját println-ével kiiratja a hozzá tartozó i-t akkor miért nem a hívás sorrendjében 4-től 0-ig?
Ne ess abba a gyakori hibába, hogy az i változót egynek (ugyanannak) gondolod. Annak itt minden meghíváskor saját memóriacíme, azaz értéke van és azt meg is őrzi, míg ki nem lép az eljárásból, pl.:
callMe(4):
azaz i = 4:
i--; // i=3
if (i > 0) {
callMe(i); // i=3, azaz callMe(3)
// i még mindig 3, mert ezt az i-t a callMe meghívása nem változtatta meg (hiába van benne i--, az egy másik i)
}
System.out.println(i); // i=3, tehát most írja ki, hogy 3
}
Szimuláljuk le ezt itt. Abban van egy újabb callme() hívás, majd egy printl. Ugye tudjuk, hogy a végrehajtás szekvenciális,a printl csak akkor fut le, amikor a callme() előtte lefutott teljesen. Namost, amikor meghívod újra a callme()-t, az egy új példányt hoz létre, ahol i=4. Tehát megvan az eredeti példány, ahol i=5, és van egy második példány, ahol i=4. Ez meghív egy újabb példányt i=3-al, az i=2-vel, i=1-el, végül i=0-val. Az utolsó példánynál már nem lesz újabb függvényhívás, így az továbblép a printl-re, kiírja a 0-t. Aztán eza függvény a végére ér, így az eggyel felette levő példány, ami i=1, folytatódika callme() hívás utáni résszel, kiírja az 1-et. Ez is végetér, folytatódik az i=2 változat, az is kiír. És így megy ez egészen addig, míg a legfelső, 5-el emghívott változat is kiírja az eredményt.
EZÉRT kerülnek fordított sorrendben kiírásra, a rekurzív függvényhívásoknál erre oda kell figyelni, hogy ami a függvényhívás után van, az csak akkor fog lefutni, amikor a meghívott függvény visszatért/lefutott.
Kapcsolódó kérdések:
Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!