Uvediem výpis z kódu na výpočet faktoriálu:
static long computeR(int n) {
if (n == 1) return n;
return computeR(n - 1) * n;
} // computeR(int) method
}
Som z toho už zúfalý, viem, že to funguje, viem, že to vracia to čo má ja len fakt nechápem ako :-(
Ved už len príkaz "IF (n==1) return n; by mal podla mňa vrátiť číslo 1 a nie faktoriálne číslo, ďalší príkaz "return computeR(n-1)*n"; by mal podla toho čo viem číslo n zvyšovať a nie zmenšovať k číslu 1.
Fakt som z toho vedla a neviem sa s tým nijako pohnúť, akoby tam boli (mali byť 2 premenné)
Please help, budem fakt vďačný za akékoľvek vysvetlenie
Fórum › Java
Pomóóc s rekurziou
To mio: Ahoj, rekurze neni na pochopeni tak náročná, ale celkem špatně se to vysvětluje tak, aby se to dalo snadno pochopit :-). Pokusím se to vysvětlit na konkrétním čísle hezky krok za krokem. Takže řekněme, že zavoláme metodu/funkci computeR(4) - tedy n = 4. Jako první se vyhodnocuje podmínka v IFu n==1, která je FALSE. Takže program pokračuje řádkem "return computeR(n - 1)*n;". Příkaz return má vrátit celočíselnou hodnotu "computeR(n - 1)*n", která doposud není známa, takže příkaz return musí počkat. Program pokračuje voláním metody computeR(n - 1), tedy computeR(3). Metoda v průběhu svého vykonávání volá znovu sama sebe ovšem pro hodnotu o jedničku menší. Takže program vykonává metodu computeR(3), metoda computeR(int n) je tedy spuštěná už dvakrát, poprvé pro n=4 a podruhé pro n=3. If je znovu FALSE a program znovu přeskakuje na řádek "return computeR(n - 1)*n;". Příkaz return opět čeká a program volá metodu computeR(n - 1), tedy computeR(2). Naše metoda teď tedy bězí pro n=2, if je opět FALSE, znovu tak pokračujeme řádkem "return computeR(n - 1)*n;" a dochází k volání metody computeR(n - 1), tedy computeR(1). Tentokrát je ale podmínka IFu TRUE, protože n=1. Program proto dále pokračuje příkazem return n; tzn. metoda computeR(1) je ukončena a vrací hodnotu n (jedničku) metodě, která ji zavolala, tedy computeR(2). Vrátili jsme se do computeR(2) na řádek "return computeR(n - 1)*n;", když dosadíme n, získáme "return computeR(2 - 1)*2;", jednoduchou úpravou pak "return computeR(1)*2;" a protože computeR(1) nám vrátila jedničku "return 1*2;". Takže vlastně "return 2;". Metoda computeR(2) je ukončena a vrací hodnotu 2 metodě, která ji zavolala, tedy computer(3). A znovu se ocitáme na řádku "return computeR(n - 1)*n;". Tentokrat dostaneme "return computeR(2)*3;" z toho "return 2*3;" a z toho "return 6;". Metoda computeR(3) je ukončena a vrací číslo 6 metodě, která ji zavolala, tedy computeR(4). A znovu jsme na řádku "return computeR(n - 1)*n;" (už naposled), "return computeR(3)*4;" z toho "return 6*4;" a z toho "return 24;". Takže metoda computeR(4) je ukončena a vrací 24, což je 4! - požadovaný výsledek.
Omlouvám se, že je to tak dlouhé, snažil jsem se to podat "polopaticky". Zkus si to projít pomalu krok za krokem a někam si to nakreslit. Snad se to nechá... kdyžtak se ptej co není jasné.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Typovy subor --- record--- pomooc — založil fresh99
Php mysql vypis z DB POMOOC !!! — založil janik366
Spatne zobrazeni obrazkove galerie v IE — založil seno1
Moderátoři diskuze