Rekursio on prosessi, jossa määritellään ongelma (tai ratkaisu ongelmaan) kannalta (yksinkertaisempi versio) itse.

esimerkiksi, voimme määritellä toiminnan ”löydä kotiin” seuraavasti:

  1. Jos olet kotona, älä liiku.

  2. Ota yksi askel kohti kotia.

  3. ”find your way home”.

tässä ratkaisu kotimatkan löytämiseen on kaksi askelta (kolme askelta). Ensin emme mene kotiin, jos olemme jo kotona., Toiseksi teemme hyvin yksinkertaisen toimenpiteen, joka tekee tilanteemme helpommaksi ratkaista. Lopulta koko algoritmi uusitaan.

yllä olevaa esimerkkiä kutsutaan hännän rekursioksi. Tässä viimeinen lausuma kutsuu rekursiivista algoritmia. Hännän rekursio voidaan kääntää suoraan silmukoiksi.

miten kirjoittaisit rekursiivisen ”algoritmin” Temppeliaukion löytämiseen?

toinen esimerkki rekursiosta olisi maksimiarvon löytäminen numeroluettelosta. Suurin arvo luettelossa on joko ensimmäinen numero tai suurin jäljellä olevista numeroista., Tässä on, miten kirjoittaa pseudokoodina algoritmi:

Osat Rekursiivinen Algoritmi

Kaikki rekursiiviset algoritmit on oltava seuraavat:

  1. Base-Case – (eli, milloin lopettaa)

  2. Työ kohti Base Tapauksessa,

  3. Rekursiivinen Kutsu (eli kutsumme itseämme)

”työ kohti base case” on, jos me tehdä ongelma yksinkertaisempaa (esim. jaa listan kahteen osaan, kukin pienempi kuin alkuperäinen). Rekursiivinen puhelu, jossa käytämme samaa algoritmia ongelman yksinkertaisemman version ratkaisemiseksi., Perustapaus on ratkaisu ”yksinkertaisin” mahdollinen ongelma (esimerkiksi, pohja tapauksessa ongelma löytää suurin määrä luettelo’ olisi, jos listassa oli vain yksi numero… ja määritelmällisesti jos on vain yksi numero, se on suurin).

Yksinkertainen Esimerkki: Lisää kolme numerot

Lisäämällä kolme numeroa vastaa lisäämällä kaksi ensimmäistä numeroa, ja sitten lisäämällä nämä kaksi numeroa uudelleen.

(Huom.Matlabissa funktiota voidaan kutsua ilman kaikkia argumentteja. Nargin-toiminto kertoo tietokoneelle, kuinka monta arvoa määritettiin., Näin add_numbers(1) olisi nargin 1; add_numbers(1,1) olisi nargin 2; add_numbers(1,1,1) olisi nargin 3.)

Tunnistaa 3 osaa rekursiivinen algoritmi:

Kaikki rekursiivinen algoritmi on oltava seuraavat kolme vaihetta:

Miksi Rekursio Toimii

rekursiivinen algoritmi, tietokone ”muistaa” kaikki aiemmat valtion ongelma. Tämä tieto on ”hallussa”, jonka tietokone ”activation stack” (eli jokaisen sisällä toimintoja työtilassa).

jokaisella funktiolla on oma työtilansa funktion KUTSUKOHTAISESTI.,

Sokkelo Esimerkki:

Harkitse suorakaide grid huonetta, jossa jokainen huone voi olla tai olematta ovet Pohjoiseen, Etelään, Itään ja Länteen puolin.

miten löydät tiesi ulos sokkelosta? Tässä on yksi mahdollinen ”algoritmi” vastauksen löytämiseen:

jokaiselle nykyisen huoneen ovelle, jos ovi johtaa ulos, ota tuo ovi.

”temppu” tässä on tietysti, mistä tiedämme, johtaako ovi poistumiseen johtavaan huoneeseen? Vastaus on, että emme tiedä, mutta voimme antaa tietokoneen selvittää sen puolestamme.

mikä on rekursiivinen osa yllä olevasta algoritmista?, Sen ”ovi johtaa ulos sokkelosta”. Mistä tiedämme, johtaako ovi sokkelosta ulos? Tiedämme, koska sisällä viereisessä huoneessa (läpi oven), esitämme saman kysymyksen, miten pääsemme ulos sokkelo?

Mitä tapahtuu, on tietokone ”muistaa” kaikki ”mitä jos”. Mitä jos otan ensimmäisen oven, mitä jos otan toisen oven, mitä jos otan viereisen oven jne. Ja jokaisen mahdollisen oven voit liikkua, tietokone muistaa ne mitä ifs, ja jokainen ovi sen jälkeen, ja sen jälkeen, jne, kunnes lopulta on löytynyt.

tässä on lähellä varsinaista koodien toteutusta.,

kysymys: Mikä on pohjatapaus yllä?

vastaus: (se oli kompakysymys) koodissa ei ole perustapausta. Tarkista alussa, onko huone uloskäynti. Jos on, ei rekursiota!

  function success = find_way_out( maze, room ) if room is exit → return true room ← mark as visited % rest of code ... end  

Kysymys: Miten merkitä huoneessa käynyt?

vastaus: on olemassa erilaisia tekniikoita. Jos huone on rakenne (tai esine)voit lisätä vierailtu kentän suuntaan huoneeseen. (esim., huone.visited = true;) jos et käytä esineitä, voit olla matriisi boolean liput, joka on samankokoinen/muoto kuin sokkelo ja käyttää näitä arvoja.,

kysymys: ovatko muut ongelmat edellä mainitun algoritmin kanssa?

Vastaus: vastaus löytyy miettimällä seuraavia kysymyksiä: Mitä tapahtuisi, jos sokkelo oli jättiläinen verkkoon identtisesti kokoinen suorakaiteen huonetta, joissa kaikissa ovia on joka seinällä? Kuvittele, että menet pohjoiseen ensimmäisestä ovesta, sitten itään naapurihuoneiden ovesta, sitten etelään tuon huoneen ovesta ja sitten länteen tuon huoneen ovesta. Mihin sinä päädyt? Takaisin sinne, mistä aloitit! Mikä pahinta, voit jatkaa tämän silmukan tekemistä ikuisesti. Miten peloton seikkailija ratkaisisi tämän ongelman?,

Yksi vastaus, joka on käyttämällä liidun ja laittamalla iso X lattialla jokaisessa huoneessa kirjoitat. Kun Palaat huoneeseen, jossa X on lattialla, tiedät, ettei sinun tarvitse mennä sisään. Ohjelman yhteydessä tulisi käyttää boolien lippua” nähty” tai ”vieraillut”. Jokaisessa huoneessa on lippu. Jokainen huone alkaa siitä, että lippu asetetaan vääräksi. Kun käyt huoneessa, asetat lipun toteen., Lopuksi, ”base case” on viiva, kuten:

  function success = find_way_out( maze, room ) % exit chack if room is visited → return false % rest of code ... end  

Rekursio voidaan yhtä hyvin soveltaa tietokone algoritmeja:

Joitakin Tietokoneeseen liittyviä esimerkkejä ovat: Lisäämällä luettelon numerot, Laskenta Fibonaccin, computing Kertoma, ja Sudoku.

Silmukoita ja Hännän Rekursio

Jotkut rekursiiviset algoritmit ovat hyvin samankaltaisia silmukoita. Näitä algoritmeja kutsutaan ”hännän rekursiivisiksi”, koska algoritmin viimeinen lauseke on” käynnistää ” algoritmi uudelleen. Hännän rekursiiviset algoritmit voidaan kääntää suoraan silmukoiksi.