Megválaszolatlan hozzászólások | Aktív témák Pontos idő: szomb. jún. 15, 2024 19:11



Hozzászólás a témához  [ 56 hozzászólás ]  Oldal Előző  1, 2
Rekurzió -- mi a rák az? 
Szerző Üzenet
Moderátor
Avatar

Csatlakozott: szer. márc. 24, 2004 13:43
Hozzászólások: 6486
Tartózkodási hely: Bonyhád - BP
Hozzászólás 
Dester írta:
Zsoca jól leírta.
A faktoriális megoldható FOR ciklussal is, de rekurzívan is. Egyébként a Hanoi tornyainak a talán legismertebb megoldása tipikusan rekurzív probléma (persze van nem rekurzív megoldása is).

A faktoriális függvény rekurzióval pl. Pascal (Delphi) szintaktikával:

Kód:
Function Fakt(N: Integer): Integer;
Begin
  If N=1 Then
    Result:=1
  Else
    Result:=N*Fakt(N-1);
End;



Meghívása pl.
WriteLn(Fakt(10));

Látható, hogy itt is van feltétel, mert egyébként végtelen ciklust írunk. Ezen egyszerűen végig tudod gondolni, hogy mit is csinál a függvény.


Igen, tanár is valami ilyesmit írkált. De itt amit nem értek: úgye n kap egy értéket, pl 10, akkor mivel nem egyenlő 1-gyel, ezért csökkenti mindig n értékét. De, amikor egy lesz n, akkor a fügvény értéke is egy lesz (result:=1). Innen hogyan jut el odáig, hogy a függvény a megfelelő értéket kapja?
szerk: Hupszi, kicsit elcsúsztam az írással és a quoten belül írtam


A hozzászólást 1 alkalommal szerkesztették, utoljára Hannibal szer. jan. 25, 2006 15:50-kor.



szer. jan. 25, 2006 9:17
Profil Privát üzenet küldése Honlap
a fórum lelke

Csatlakozott: szer. márc. 24, 2004 13:43
Hozzászólások: 12729
Tartózkodási hely: FLF
Hozzászólás 
és a fentiekből következik, hogy minden rekurzív algoritmus kibonható nem rekurzívá.


szer. jan. 25, 2006 1:47
Profil Honlap
Moderátor
Avatar

Csatlakozott: kedd nov. 02, 2004 17:38
Hozzászólások: 5120
Tartózkodási hely: Budapest/Szeged
Hozzászólás 
Zsoca jól leírta.
A faktoriális megoldható FOR ciklussal is, de rekurzívan is. Egyébként a Hanoi tornyainak a talán legismertebb megoldása tipikusan rekurzív probléma (persze van nem rekurzív megoldása is).

A faktoriális függvény rekurzióval pl. Pascal (Delphi) szintaktikával:

Kód:
Function Fakt(N: Integer): Integer;
Begin
  If N=1 Then
    Result:=1
  Else
    Result:=N*Fakt(N-1);
End;


Meghívása pl.
WriteLn(Fakt(10));

Látható, hogy itt is van feltétel, mert egyébként végtelen ciklust írunk. Ezen egyszerűen végig tudod gondolni, hogy mit is csinál a függvény.


kedd jan. 24, 2006 23:18
Profil Privát üzenet küldése Honlap
gyémánt tag
Avatar

Csatlakozott: pén. márc. 26, 2004 9:12
Hozzászólások: 2711
Tartózkodási hely: Budapest, Érd
Hozzászólás 
Ahogy az előttem szóló is leírta a lényeg: rekurzív az az eljárás, mely képes önmagát meghívni.
Ha tanultatok már bináris keresést, akkor már láttál rá példát is hogy mire jó.

A lényege, hogy rekurzív eljárást csak VÉGES számú rekurzióra szabad írni (különben egyenlő 1 végtelen ciklussal)!

Tehát egy rekurzív eljárásban mindig van egy feltétel vizsgálat, aminek teljesülése vagy nem teljesülése esetén hívja meg önmagát. (Ez kerüli el a végtelen kört).

Még egy fontos dolog, amikor egy rekurzív eljárás meghívja önmagát (és az megint...megint...megint...), majd egyszercsak nem hívja újra magát hanem lefut, akkor a végrehajtás ott folytatódik, ahol a rekurzív hívás történt, majd még egy szinttel feljebb majd még egy szinttel feljebb...egészen addig míg a legfelső szintre ér, és kilép az eljárásból!

Próbáltam a fentebbi részt példákkal illusztrálni, de igazából csak akkor fogod látni, ha írsz például egy primitív fakturiális számító eljárást, és debug módban TRACE INTO-val megnézegeted hogyan megy végig rajta!!

Üdv,
Zsoca-M5


kedd jan. 24, 2006 22:04
Profil Privát üzenet küldése
arany tag

Csatlakozott: szer. márc. 24, 2004 13:43
Hozzászólások: 146
Hozzászólás 
Rekurzió esete akkor áll fenn, ha egy függvény önmagát hívja meg. Ennek természetesen csak bizonyos feltételek mellett szabad megtörténnie egyébként hamar elfogynak bizonyos erőforrások (stack pl.).
Pl. fájlrendszerben egy adott könyvtártól kezdve minden bejegyzést szeretnél megjeleníteni:
Kód:
File startLocation = new File("/");
printFiles(startLocation);
.
.
.
void printFiles(File startLoc) {
 File[] filesInLoc = findAllFilesIn(startLoc);
 for (int idx = 0; idx < filesInLoc.length; idx++) {
  print(filesInLoc[idx].getName());
  if (filesInLoc[idx].isDirectory()) {
    printFiles(filesInLoc[idx]);
  }
 }
}

A fenti kódban adott pont összes fájlbejegyzésén végigmegyünk, kiírjuk a nevüket, majd ha alkönyvtárral találkozunk, akkor abban is ugyanez történik. Ennyi.


kedd jan. 24, 2006 15:16
Profil Privát üzenet küldése
Moderátor
Avatar

Csatlakozott: szer. márc. 24, 2004 13:43
Hozzászólások: 6486
Tartózkodási hely: Bonyhád - BP
Hozzászólás Rekurzió -- mi a rák az?
Üdv Mindenki!

Lenne egy olyan kérdésem, hogy mi az isten az a rekurzó meg a rekurzív programok stb.
Ezt azért kérdezem, mert suliba elvileg ezt tanuljuk, de még érthetően senki nem tudott róla egy mukkot se mondani nekem, se az osztálynak.
Hálás lennék, ha valaki leírná részletesen hogy mi is ez, lehetőleg példákkal szemléltetve.

Köszi szépen!

Hannibal


kedd jan. 24, 2006 15:00
Profil Privát üzenet küldése Honlap
Hozzászólások megjelenítése:  Rendezés  
Hozzászólás a témához   [ 56 hozzászólás ]  Oldal Előző  1, 2

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 2 vendég


Nem nyithatsz témákat ebben a fórumban.
Nem válaszolhatsz egy témára ebben a fórumban.
Nem szerkesztheted a hozzászólásaidat ebben a fórumban.
Nem törölheted a hozzászólásaidat ebben a fórumban.

Keresés:
Ugrás:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Magyar fordítás © Magyar phpBB Közösség