rekurzió:
programozási szempontból a rekurzív függvény olyan rutinként definiálható, amely közvetlenül vagy közvetve nevezi magát.
rekurzív algoritmus segítségével bizonyos problémák meglehetősen könnyen megoldhatók. A Hanoi tornyai (TOH) egy ilyen programozási gyakorlat. Próbáljon meg írni egy iteratív algoritmust a TOH-hoz. Ezenkívül minden rekurzív program iteratív módszerekkel írható (Lásd az adatstruktúrákat Lipschutz).
matematikailag rekurzió segít megoldani néhány rejtvényeket könnyen.,
például egy rutininterjú kérdés,
Az N emberek pártjában mindenki csak egyszer rázza meg a kezét egymással. Összesen hány kézfogás fog történni?
megoldás:
meg lehet oldani különböző módon, grafikonok, rekurzió, stb .. Lássuk, milyen rekurzív módon lehet megoldani.
vannak N személyek. Minden ember csak egyszer kezet fog egymással. Figyelembe véve az n-edik személyt, (k)kezet kell ráznia (N-1) személyekkel. Most a probléma az (N-1) személyek kis példányára csökkent. Feltételezve, hogy a TN teljes kézfogás, rekurzívan megfogalmazható.,
TN = (N-1) + TN-1
megoldása rekurzívan aritmetikai sorozatot eredményez, amely N(N-1)/2 értékelhető.
gyakorlat: az N Párok pártjában csak egy nem (férfi vagy nő) tud kezet fogni mindenkivel. Hány kézfogás történne?
a rekurzív programok általában rossz időbonyolultságot eredményeznek. Példa erre a Fibonacci sorozat. Az n-edik Fibonacci szám rekurzióval történő kiszámításának idő összetettsége körülbelül 1,6 n. ez azt jelenti, hogy ugyanaz a számítógép közel 60% – kal több időt vesz igénybe a következő Fibonacci számhoz. Rekurzív Fibonacci algoritmus átfedésben alproblémák., Vannak más technikák, mint a dinamikus programozás, hogy javítsa az ilyen átfedésben algoritmusok.
azonban néhány algoritmus (pl. egyesítés rendezés, gyors rendezés, stb…) optimális idő összetettséget eredményez a rekurzió használatával.
Base Case:
a rekurzív függvények egyik kritikus követelménye a végpont vagy az alap eset. Minden rekurzív programnak rendelkeznie kell alapesettel, hogy megbizonyosodjon arról, hogy a funkció megszűnik. A hiányzó alapeset váratlan viselkedést eredményez.,
a rekurzív függvények írásának különböző módjai
függvényhívás: (közvetlen út)
a legtöbbünk legalább két különböző módon ismeri a rekurzív programok írását. Az alábbiakban a Hanoi-kód tornyai találhatók. Ez egy példa a közvetlen hívásra.
kimenet:
Move the disk 1 from S to DMove the disk 2 from S to AMove the disk 1 from D to AMove the disk 3 from S to DMove the disk 1 from A to SMove the disk 2 from A to DMove the disk 1 from S to D
az idő összetettsége TOH lehet kiszámítani megfogalmazásával lépések száma.
kell lépnünk az első N-1 lemezeket Forrást Kiegészítő, valamint a Kiegészítő Cél, azaz az első N-1 lemez, amelyhez két mozog. Még egy lépés az utolsó lemezről a forrásról a rendeltetési helyre., Matematikailag rekurzívan definiálható.
MN = 2mn-1 + 1.
könnyen megoldhatjuk a fenti rekurzív relációt (2n-1), amely exponenciális.
rekurzió kölcsönös függvényhívással: (közvetett módon)
közvetett hívás. Bár a legkevésbé pratikus, egy függvény hívhat egy másik funkciót, amely inturn kéri korábbi függvény. Ebben az esetben mindkét funkciónak rendelkeznie kell az alaptesttel.
Defensive Programming:
a védekező kódolási technikákat a rekurzióval kombinálhatjuk az alkalmazás kecses funkcionalitása érdekében., Általában a rekurzív programozás nem engedélyezett a biztonság szempontjából kritikus alkalmazásokban, például a repülésvezérlésben, az egészségügyi ellenőrzésben stb. Az ellenőrizetlen hívások elkerülése érdekében azonban statikus számlálási technikát alkalmazhatunk (nem a biztonságkritikus rendszerekben, hanem a soft valós idejű rendszerekben).
callDepth mélység függ függvény verem keret mérete és maximális verem mérete.
rekurzió függvénymutatókkal: (indirekt módon)
a rekurzió függvénymutatókkal is végrehajtható. Példa erre a POSIX panaszrendszerek jelkezelője., Ha a kezelő ugyanazt az eseményt indítja el, amely miatt a kezelőt hívják, a funkció újra megjelenik.