Valaki leírná, elmagyarázná ezt a rekurzív függvényes dolgot?
Pl.:
int faktorialis(int n)
{
if(n <= 1)
return 1;
return n * faktorialis(n-1);
}
Én ott elakadok, hogy vagy így,vagy úgy tér vissza a fgv,de "egymásba ágyazva".
Hogy tud visszatérni egy fgv többször?
Ha meg n=4,akkor hol tárolódik a többi "return" eredmény?
Először meghívódik n=4-el, majd 3-al, majd 2-vel, majd 1-el. Ekkor n=1-re megtudjuk a választ -> n=2-es visszatér 2-vel -> n=3-as visszatér 6-al -> n=4-es visszatér 24-el.
Olyan mint a sugdolózós játék, oda-vissza közlekedik az adat ugyanazon függvény különböző példányai között.
Oké.
legyen n=2 akkor az ugye nagyobb mint 1. Így n az 2 * faktorialis(n-1). De a függvény n-1et kap azaz egy. De ha újra futtatod, akkor már return 1-et ad. Így kapsz 2*1-et.
Ha 3mal futtatod, akkor (3 * faktorialis(3-1))*faktorialis(2-1) Ugye a zárójel felbontható így kapsz 3*2*1-et.
> Hogy tud visszatérni egy fgv többször?
A függvényhíváshoz szükséges paraméterek a veremben tárolódnak.
Több hívás esetén a verem mérete megnő, ezért számítanak instabilnak a rekurzív függvények
n=4 esetén a következő értékek kerülnek be a verembe: 4,3,2,1, ahol a legutolsó n=1 hívásra a visszatérési érték 1. A rekurziót "visszagörgetve" a veremben lévő értékek összeszorzódnak. Így lesz az eredmény 24.
A rekurzív faktoriális egy állatorvosi ló, egyetlen lehetséges haszna, hogy megtanítja a rekurzív függvényhívást. Gyakorlatban fa bejárásnál szokás használni rekurzív függvényeket.
A következő megoldás nem használ rekurziót, ráadásul konstans idejű:
template <int n>
struct factorial {
enum { value = n * factorial<n - 1>::value };
};
template <>
struct factorial<0> {
enum { value = 1 };
};
Próba:
factorial<0>::value; //eredménye 1 lesz.
factorial<4>::value; //eredménye 24 lesz.
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!