a rekurzió a probléma (vagy a probléma megoldása) meghatározásának folyamata (az egyszerűbb verziója) szempontjából.
például meghatározhatjuk a “find your way home” műveletet:
-
ha otthon van, hagyja abba a mozgást.
-
Take one step towards home.
-
“találd meg az utat haza”.
itt a megoldás, hogy megtalálja az utat haza két lépésben (három lépésben). Először is, nem megyünk haza, ha már otthon vagyunk., Másodszor, egy nagyon egyszerű lépést teszünk, amely megkönnyíti a helyzetünk megoldását. Végül újra elkészítjük a teljes algoritmust.
a fenti példát farok rekurziónak nevezik. Ez az, ahol az utolsó állítás hívja a rekurzív algoritmus. A farok rekurziója közvetlenül hurkokra fordítható.
hogyan írnál rekurzív “algoritmust” a Templom tér megtalálásához?
a rekurzió másik példája a maximális érték megtalálása a számok listájában. A lista maximális értéke az első szám vagy a fennmaradó számok közül a legnagyobb., Itt van, hogyan tudnánk írni a pszeudokód az algoritmus:
Részei egy Rekurzív Algoritmus
Minden rekurzív algoritmusokat kell a következő:
-
Alap Esetben (azaz, mikor kell abbahagyni)
-
a Munka felé alapeset
-
Rekurzív Hívás (pl. hívjuk magunkat)
A “munka felé alapeset” van, ahol mi a probléma egyszerűbb (pl., oszd lista két részre, mindegyik kisebb, mint az eredeti). A rekurzív hívás, ahol ugyanazt az algoritmust használjuk a probléma egyszerűbb verziójának megoldására., Az alap eset a megoldás a “legegyszerűbb” lehetséges probléma (például az alap esetében a probléma “megtalálni a legnagyobb számot a listán” lenne, ha a lista csak egy szám… definíció szerint, ha csak egy szám van,akkor ez a legnagyobb).
egyszerű példa: adjon hozzá három számot
három szám hozzáadásával egyenértékű az első két szám hozzáadásával, majd ismét hozzáadja ezt a két számot.
(megjegyzés: a MATLAB-ban egy függvény hívható az összes argumentum nélkül. A nargin funkció megmondja a számítógépnek, hogy hány értéket határoztak meg., Így add_numbers(1) lenne egy nargin 1; add_numbers(1,1) volna egy nargin 2; add_numbers(1,1,1) lenne egy nargin 3.)
azonosítsa a rekurzív algoritmus 3 részét:
az összes rekurzív algoritmusnak a következő három szakaszból kell állnia:
miért működik a rekurzió
rekurzív algoritmusban a számítógép “emlékszik” a probléma minden korábbi állapotára. Ezt az információt a számítógép “tartja” az “aktiválási veremben” (azaz az egyes funkciók munkaterületén belül).
minden függvénynek saját munkaterülete van a függvény hívásonként.,
labirintus példa:
fontolja meg a szobák téglalap alakú rácsát, ahol minden szoba északi, déli, keleti és nyugati oldalán lehet vagy nem lehet ajtó.
hogyan találja meg a kiutat a labirintusból? Itt van egy lehetséges “algoritmus” a válasz megtalálásához:
az aktuális helyiség minden ajtójához, ha az ajtó a kijárathoz vezet, vegye be az ajtót.
a “trükk” itt természetesen honnan tudjuk, hogy az ajtó olyan helyiséghez vezet-e, amely a kijárathoz vezet? A válasz az, hogy nem, de hagyhatjuk, hogy a számítógép kitalálja nekünk.
mi a rekurzív rész a fenti algoritmusról?, A “ajtó vezet ki a labirintusból”. Honnan tudjuk, hogy egy ajtó vezet ki a labirintusból? Tudjuk, mert a szomszéd szobában (az ajtón keresztül) ugyanazt a kérdést tesszük fel, hogyan jutunk ki a labirintusból?
mi történik a számítógép ” emlékszik “az összes”mi ifs”. Mi van, ha az első ajtót veszem, mi van, ha a második ajtót veszem, mi van, ha a szomszédba megyek, stb. Minden lehetséges ajtónál, amelyen keresztül mozoghat, a számítógép emlékszik azokra, amiket ifs, minden ajtó után, majd utána, stb., amíg meg nem találja a végét.
itt van egy közel a tényleges kód végrehajtása.,
kérdés: mi a fenti alap eset?
válasz: (ez egy trükkös kérdés volt) a kódban nincs alap eset. Először ellenőriznie kell, hogy a szoba a kijárat. Ha igen, nincs rekurzió!
function success = find_way_out( maze, room ) if room is exit → return true room ← mark as visited % rest of code ... end
kérdés: hogyan jelöli meg a szobát látogatottnak?
válasz: vannak különböző technikák. Ha a szoba szerkezet (vagy tárgy), akkor a meglátogatott mező irányát hozzáadhatja a helyiséghez. (pl. szoba.ha nem használ objektumokat , akkor lehet, hogy a logikai zászlók mátrixa azonos méretű / alakú, mint a labirintus, és ezeket az értékeket használja.,
kérdés: a fenti algoritmussal kapcsolatos egyéb problémák?
válasz: a válasz erre a következő kérdésre gondolva található: Mi történne, ha a labirintus azonos méretű téglalap alakú helyiségek óriási rácsa lenne, mindegyik ajtóval minden falon? Képzelje el, hogy észak felé megy az első ajtón keresztül, majd keletre a szomszédos szobák ajtaján keresztül, majd délre a szobák ajtaján keresztül, majd nyugatra a szobák ajtaján keresztül. Hol kötsz ki? Vissza, ahol elkezdted! Ami még rosszabb, lehet, hogy továbbra is ezt a hurkot örökre. Hogyan oldaná meg egy rettenthetetlen kalandor ezt a problémát?,
erre az egyik válasz, hogy egy darab krétával, és hogy egy nagy X a padlón minden szobában belépsz. Így amikor visszatérsz egy szobába, ahol X van a padlón, tudod, hogy nem kell belépned. A program esetében egy “látott” vagy “meglátogatott” logikai zászlót kell használni. Minden szobában van egy zászló. Minden szoba azzal kezdődik, hogy a zászló hamis. Amikor meglátogat egy szobát, igazra állítja a zászlót., Végül, az “alap esetben”van egy sor, mint például:
function success = find_way_out( maze, room ) % exit chack if room is visited → return false % rest of code ... end
rekurzió egyaránt jól alkalmazható számítógépes algoritmusok:
néhány számítógéppel kapcsolatos példák közé: hozzátéve, a számok listáját, Számítástechnika Fibonacci szekvencia, Számítástechnika faktoriális, és Sudoku.
hurkok és farok rekurzió
néhány rekurzív algoritmus nagyon hasonlít a hurkokhoz. Ezeket az algoritmusokat “farok rekurzívnak” nevezik, mivel az algoritmus utolsó kijelentése az algoritmus “újraindítása”. A farok rekurzív algoritmusai közvetlenül lefordíthatók hurkokra.
Vélemény, hozzászólás?