Recursion är processen att definiera ett problem (eller lösningen på ett problem) när det gäller (en enklare version av) själv.

Vi kan till exempel definiera åtgärden ”hitta vägen hem” som:

  1. om du är hemma, sluta flytta.

  2. ta ett steg mot hemmet.

  3. ”hitta vägen hem”.

här är lösningen att hitta vägen hem två steg (tre steg). Först åker vi inte hem om vi redan är hemma., För det andra gör vi en mycket enkel åtgärd som gör vår situation enklare att lösa. Slutligen gör vi om hela algoritmen.

ovanstående exempel kallas svans rekursion. Det är här det allra sista uttalandet kallar den rekursiva algoritmen. Svans rekursion kan direkt översättas till slingor.

hur skulle du skriva en rekursiv ”algoritm” för att hitta Temple Square?

ett annat exempel på rekursion skulle vara att hitta det maximala värdet i en lista med siffror. Det maximala värdet i en lista är antingen det första numret eller det största av de återstående siffrorna., Så här skriver vi algoritmens pseudokod:

delar av en rekursiv algoritm

alla rekursiva algoritmer måste ha följande:

  1. basfall (dvs. när du ska stoppa)

  2. arbeta mot basfall

  3. rekursivt samtal (dvs. kalla oss själva)

”arbetet mot basfallet” är där vi gör problemet enklare (t.ex. dela upp listan i två delar, var och en mindre än originalet). Det rekursiva samtalet är där vi använder samma algoritm för att lösa en enklare version av problemet., Basfallet är lösningen på det ”enklaste” möjliga problemet (till exempel skulle basfallet i problemet ”hitta det största numret i en lista” vara om listan bara hade ett nummer… och per definition om det bara finns ett nummer är det det största).

enkelt exempel: lägg till tre nummer

att lägga till tre nummer motsvarar att lägga till de två första numren och sedan lägga till dessa två nummer igen.

(Obs, i Matlab, kan en funktion anropas utan alla argument. Nargin-funktionen berättar för datorn hur många värden som angavs., Således add_numbers(1) skulle ha en nargin av 1; add_numbers(1,1) skulle ha en nargin av 2; add_numbers (1,1,1) skulle ha en nargin av 3.)

identifiera de 3 delarna av den rekursiva algoritmen:

all rekursiv algoritm måste ha följande tre steg:

varför rekursion fungerar

i en rekursiv algoritm kommer datorn ”ihåg” varje tidigare tillstånd av problemet. Denna information ”hålls” av datorn på ”aktiverings stack” (dvs inuti varje funktioner arbetsyta).

varje funktion har sin egen arbetsyta PER samtal av funktionen.,

Maze exempel:

överväga en rektangel rutnät av rum, där varje rum kan eller kanske inte har dörrar på norra, södra, östra och västra sidor.

hur hittar du din väg ut ur en labyrint? Här är en möjlig ”algoritm” för att hitta svaret:

för varje dörr i det aktuella rummet, om dörren leder till utgången, ta den dörren.

”tricket” här är förstås, hur vet vi om dörren leder till ett rum som leder till utgången? Svaret är att vi inte gör det, men vi kan låta datorn räkna ut det för oss.

vad är den rekursiva delen om ovanstående algoritm?, Dess ”dörren leder ut ur labyrinten”. Hur vet vi om en dörr leder ut ur labyrinten? Vi vet eftersom inne i nästa rum (går genom dörren), frågar vi samma fråga, Hur kommer vi ut ur labyrinten?

vad som händer är att datorn ”kommer ihåg” alla ”vad ifs”. Vad händer om jag tar den första dörren, vad händer om jag tar den andra dörren, vad händer om jag tar nästa dörr etc. Och för varje möjlig dörr kan du gå igenom, datorn kommer ihåg de vad ifs, och för varje dörr efter det, och efter det, etc, fram till slutet hittas.

här är en nära faktisk kodimplementering.,

fråga: Vad är basfallet ovan?

Svar: (Det var en kuggfråga) det finns inget basfall i koden. Du måste kontrollera i början om rummet är utgången. Om det är, ingen rekursion!

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

fråga: hur markerar du rummet som besökt?

Svar: Det finns olika tekniker. Om rummet är en struktur (eller objekt)kan du lägga till den besökta fältriktningen i rummet. (t. ex. rum.besökte = sant;) om du inte använder objekt, kan du ha en matris av Booleska flaggor som ärsamma storlek/form som labyrinten och använda dessa värden.,

fråga:är de andra problemen med ovanstående algoritm?

svar: svaret på det kan hittas genom att tänka på följande fråga: Vad skulle hända om labyrinten var ett jätte rutnät av identiskt stora rektangulära rum, var och en med dörrar på varje vägg? Tänk dig att du går norrut genom den första dörren, sedan österut genom nästa rum dörren, sedan söderut genom rummet dörren, och sedan västerut genom rummet dörren. Var hamnar du? Tillbaka där du började! Värre, du kan fortsätta att göra denna loop för alltid. Hur skulle en orädd äventyrare lösa detta problem?,

ett svar på det är genom att använda en bit krita och sätta ett stort X på golvet i varje rum du anger. Således när du kommer tillbaka till ett rum med ett X på golvet, vet du att du inte behöver komma in. När det gäller programmet ska en boolesk flagga” sett” eller ”besökt” användas. Alla rum har en flagga. Varje rum börjar med flaggan inställd på falskt. När du besöker ett rum ställer du in flaggan till true., Slutligen, i ”basfallet” har du en rad som:

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

rekursion kan lika väl tillämpas på datoralgoritmer:

vissa datorrelaterade exempel inkluderar: lägga till en lista med siffror, beräkna Fibonacci-sekvensen, beräkna en faktoriell och Sudoku.

loopar och svans rekursion

vissa rekursiva algoritmer är mycket lik loopar. Dessa algoritmer kallas ”svans rekursiv” eftersom det sista uttalandet i algoritmen är att” starta om ” algoritmen. Svans rekursiva algoritmer kan direkt översättas till loopar.