Kezdőoldal » Számítástechnika » Programozás » Hogyan kell rekurzív függvényt...

Hogyan kell rekurzív függvényt tervezni? Hogyan kell debugolni?

Figyelt kérdés

Ha az a feladat, hogy "írjon egy rekurzív függvényt az alábbi problémára", akkor ennek hogyan kell nekiállni? Csak a tervezési elmélet érdekel, nem az, hogy egy konkrét példára mi a rekurzív megoldás, ezért nem írtam ki példát sem.


A kérdés másik fele, hogy ha adott egy rekurzív függvény, akkor azt hogyan tudom debugolni, hogy mit fog kiadni eredményként? Ha csak néhányszor hívja meg magát, akkor még oké, papíron levezetem szépen, ha mondjuk 100-szor hívja meg magát, mire eljut az eredményig, akkor ezt hogyan tudom kidebugolni?



2020. aug. 6. 18:32
1 2 3
 1/28 anonim ***** válasza:
100%
Debuggoláshoz: létrehozol vagy a függvényen kívül egy globális változót, vagy a függvényben egy statikusat, aminek az értékét minden egyes függvényhíváskor megnöveled egyel, így tudod hogy hányadik meghívásban van. Illetve egy jó fejlesztőkörnyezetben folyamatosan nyomon lehet követni az adott változókat, nem kell papíron semmit számolgatnod, látni fogod ha például 0 lett a maradék, vagy valami.
2020. aug. 6. 18:38
Hasznos számodra ez a válasz?
 2/28 A kérdező kommentje:

Köszi, ez nagyon jól jön fejlesztés közben. De ha papíron kell csinálni (vizsga)?


Tervezéshez: Mégiscsak írok egy példát. Például az a feladat, hogy írjak egy rekurzív függvényt, ami szétválogatja az elemeket (szétválogatás tétele). Hogyan tudom ezt megtervezni? Az oktatónk említett valamilyen speciális esetet, amit meg kell keresni és arra írni egy feltételt a rekurzióban, de k. nem értettem belőle semmit, mert nem magyarázta el rendesen. Ha jól emlékszem degenerált eset-et emlegetett, de erről nem találtam semmit, lehet, hogy csak beképzeltem.

2020. aug. 6. 18:46
 3/28 anonim ***** válasza:
37%

"De ha papíron kell csinálni (vizsga)?"


Szoftvertervezés. Állapotgép diagram...stb..

2020. aug. 6. 19:26
Hasznos számodra ez a válasz?
 4/28 anonim ***** válasza:
92%

Fontos tudni, hogy minden ami leírható ciklusokkal az leírható rekurzióval is és fordítva is igaz. Van ami rekurzióval van ami ciklusokkal egyszerűbb, persze ez emberenként is eltérő lehet bizonyos esetekben. Pl a Hanoi tornyai leprogramozása egyszerűbb rekurzióval. Mindig kell biztosítani hogy ne legyen végtelen hívási láncolat. Vagyis gondolnunk kell arra hasonlóan mint ciklusok esetén ott hogy mi a kilépési feltétel, itt hogy milyen feltétel garantálja azt hogy ne folytatódjon határtalanul a hívási lánc. Rekurzió lehet önrekurzió is, de nem csak ez hogy önmagát hívja meg a függvény hanem rekurzió minden ahol kör van a hívási láncban. Vagyis tervezhetjük segéd függvények használatával is a rekurziót.


Elemek szétválogatására rekurzív példa : [link]

Hogy lehet megtervezni? Gyakorolni, gyakorolni, gyakorolni !!!

2020. aug. 7. 01:40
Hasznos számodra ez a válasz?
 5/28 anonim ***** válasza:
61%
Nekem pont a napokban kellett egy olyan feladatot megoldanom, ahol a rekurzív megoldás volt a legkézenfekvőbb: egy tetszőlegen komplex (de nyilván nem végtelenül nagy) JSON objektumban kellett bizonyos módosításokat végrehajtani. Végig kellett nézni az objektum minden elemét, bizonyos feltételek teljesülése esetén módosításokat eszközölni, és amennyiben az elem lista vagy egy másik objektum, a függvény újra meghívta magát. Ezt a feladatot pusztán ciklusokkal megoldani nagyon nehéz lett volna.
2020. aug. 7. 10:50
Hasznos számodra ez a válasz?
 6/28 anonim ***** válasza:
94%

@07:37


"Egy függvény attól (és akkor) lesz rekurzív, hogy (ha) önmagát hívja meg. Semmi mástól."


Ha kizárólag a rekurziók közül az önrekurzióról beszélünk akkor igen. Egyébként már írtam is előtted, hogy rekurzió minden ahol kör van a hívási láncban.

Ha például f1,f2,f3 függvények és f1 hívja f2 ami hívja f3-at. Az f3 pedig f1-et hívja ez is rekurzió.


"A rekurziónál egy dologra kell nagyon figyelni, a stack-re. Mert az nem végtelen, és minden új függvényhívásnál a stackre kerül a hívó állapota, egészen addig, amíg a hívóhoz vissza nem tér a végrehajtás, vagy amíg a stack túl nem csordul."


Egyrészt nem mondanám, hogy csak egy dologra kell nagyon figyelni, másrészt a fokozatosság elve miatt ne erre fókuszáljon először egy kezdő aki most ismerkedik a rekurzióval, hogy egyáltalán eszik vagy isszák. Meg nem olyan példákat kell csinálni egy kezdőnek rekurzívan hogy telerakja a stack-et vele - egy mai gépen, ne vicceljünk már -, kivéve akkor ha végtelen hívási láncolatba került.

Egyébként meg nem beszéltünk konkrétan prog. nyelvről, én írtam egybe egy példát, de ez az én dolgom. Úgy univerzálisan meg nem mondhatjuk "minden új függvényhívásnál a stackre kerül a hívó állapota", ez nem igaz. Vannak olyan problémák melyeket rekurzívan sokkal egyszerűbben meg lehet oldani mint ciklusokkal. Ha ezt kell hatékonyan megoldani (órabérbe is), többek között ezért találtak ki vannak a DSL (Domain Specific Language) domén specifikus prog nyelvek-et amiben adott feladatkör problémáit egyszerűbben meg lehet oldani. Ha rekurzióra kell akkor ajánlom a Haskell-t. Tisztán funkcionális, a lambda-kalkulus formális rendszeren alapszik. Sokkal hatékonyabban kioptimalizálja futás közben a stack kérdést szemben mintha bármely másba írtuk volna meg tisztán funkcionális paradigma szerint a kódot. Az egész egy állapotmentes rendszert alkot, nincsenek benne a prog. nyelvek értelmében vett változók.

2020. aug. 7. 11:57
Hasznos számodra ez a válasz?
 7/28 anonim ***** válasza:
16%

"Egyébként már írtam is előtted, hogy rekurzió minden ahol kör van a hívási láncban."


Ez téves megállapítás, mert része lehet egy vagy több szekvencia is indirekt rekurziónak, de mégsem lesz rekurzív. De még maguk a rekurzív hívó után hívott függvények sem lesznek feltétlenül rekurzívak.


"másrészt a fokozatosság elve miatt ne erre fókuszáljon először egy kezdő aki most ismerkedik a rekurzióval,"


De, pedig erre kell figyelnie, mert ezt várják el tőle első körben, hogy a függvénye terminális-e? Ez fontosabb a függvény által visszaadott érték helyességétől is. Nem véletlenül.

2020. aug. 7. 12:14
Hasznos számodra ez a válasz?
 8/28 anonim ***** válasza:
0%

"Úgy univerzálisan meg nem mondhatjuk "minden új függvényhívásnál a stackre kerül a hívó állapota", ez nem igaz. "


Hát, nem tudom, hogy te hol tanultad azt amit tudsz, de hogy nem jó helyen, az biztos.

Egy függvény lokális változói, visszatérési értéke és visszatérési címe, jelen idő szerint azon a stack-en foglal helyet, amit éppen ebből a célból hoztak létre.

2020. aug. 7. 12:22
Hasznos számodra ez a válasz?
 9/28 anonim ***** válasza:
89%

"Ez téves megállapítás, mert része lehet egy vagy több szekvencia is indirekt rekurziónak, de mégsem lesz rekurzív. De még maguk a rekurzív hívó után hívott függvények sem lesznek feltétlenül rekurzívak."


Itt van tessék wiki oldal róla amiről beszéltem, én máshogy fogalmaztam meg saját szavaimmal, saját kútfőből, de tessék : Rekurzió típusai : közvetett, közvetlen.

[link]


"De, pedig erre kell figyelnie, mert ezt várják el tőle első körben, hogy a függvénye terminális-e? Ez fontosabb a függvény által visszaadott érték helyességétől is. Nem véletlenül."


Igen, de arra mondtam hogy , nem azt hogy lehet ha máshogy írta volna meg rekurzióval akkor kevesebb stack-et foglal. Nem kell kiforgatni a szavaimat.


"Hát, nem tudom, hogy te hol tanultad azt amit tudsz, de hogy nem jó helyen, az biztos.


Egy függvény lokális változói, visszatérési értéke és visszatérési címe, jelen idő szerint azon a stack-en foglal helyet, amit éppen ebből a célból hoztak létre."


Kezdő lehetsz. Ajánlom megismerni a Haskell-t, tisztán funkcionális programozási nyelv. Nincsenek benne a programozási nyelvek értelmében vett változók benne, de már említettem.

2020. aug. 7. 13:08
Hasznos számodra ez a válasz?
 10/28 anonim ***** válasza:
Utolsó: Ha Egyetemet végeztél és csináltál már diplomamunkát valaha, akkor tudnod kéne, hogy a wikipedia nem hiteles forrás. :). A többi megállapításoddal nem vitatkozok. Csak ennyivel szerettelek volna "kiegészíteni ".
2020. aug. 7. 13:12
Hasznos számodra ez a válasz?
1 2 3

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

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!