Pomóóc s rekurziou – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Pomóóc s rekurziou – Java – Fórum – Programujte.comPomóóc s rekurziou – Java – Fórum – Programujte.com

 

mio0
Newbie
25. 9. 2007   #1
-
0
-

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

Nahlásit jako SPAM
IP: ...–
enzoe
~ Anonymní uživatel
5 příspěvků
25. 9. 2007   #2
-
0
-

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é.

Nahlásit jako SPAM
IP: ...–
mio0
Newbie
26. 9. 2007   #3
-
0
-

To enzoe: Fakt díky moc za podrobné vysvetlenie, už je mi to jasné. Vysvetlil si to lepšie ako moje dve knihy z ktorých sa učím Javu :-).
Ešte raz dík.

Nahlásit jako SPAM
IP: ...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 8 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý