Kezdőoldal » Számítástechnika » Programozás » Miért ebben a sorrendben írj...

Miért ebben a sorrendben írj ki a számokat a függvény (Java)?

Figyelt kérdés

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?



2016. ápr. 1. 19:34
 1/6 A kérdező kommentje:

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?

2016. ápr. 1. 19:37
 2/6 anonim ***** válasza:
Ha a print(i) a callMe(i) elott lenne, akkor ugy lenne ahogy elkepzelted.
2016. ápr. 1. 20:18
Hasznos számodra ez a válasz?
 3/6 anonim ***** válasza:
100%
Ez egy rekurzív függvény, tehát önmagát ismétli addig amíg i értéke nem lesz 0, ezután kiírja a 0 visszatér a 4.ként meghívott függvényre, ott kiírja az 1-et....
2016. ápr. 1. 20:39
Hasznos számodra ez a válasz?
 4/6 anonim ***** válasza:

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

}

2016. ápr. 1. 21:31
Hasznos számodra ez a válasz?
 5/6 anonim ***** válasza:
100%

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.

2016. ápr. 1. 21:55
Hasznos számodra ez a válasz?
 6/6 A kérdező kommentje:
köszi
2016. ápr. 3. 15:52

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!