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:

  1. ha otthon van, hagyja abba a mozgást.

  2. Take one step towards home.

  3. “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ő:

  1. Alap Esetben (azaz, mikor kell abbahagyni)

  2. a Munka felé alapeset

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