Recursion er prosessen med å definere et problem (eller løsningen på et problem) i form av (en enklere versjon av) seg selv.
For eksempel, vi kan definere drift «finne veien hjem» som:
-
Hvis du er hjemme, slutter å bevege seg.
-
Ta et skritt i retning hjem.
-
«finne veien hjem».
Her løsningen til å finne veien hjem er to trinn (tre trinn). For det første kan vi ikke dra hjem hvis vi er allerede hjemme., For det andre, vi gjør en veldig enkel handling som gjør situasjonen enklere å løse. Til slutt vil vi gjøre om hele algoritmen.
I eksemplet ovenfor er kalt halen recursion. Dette er hvor den aller siste setningen kan kalle den rekursive algoritmen. Halen recursion kan direkte oversettes til looper.
Hvordan vil du skriv en rekursiv «algoritme» for å finne Temple Square?
et Annet eksempel på recursion ville være å finne den største verdien i en liste av tall. Den høyeste verdien i en liste er enten første nummeret eller den største av de øvrige tallene., Her er hvordan vi skulle skrive det pseudocode av algoritmen:
Deler av en Rekursiv Algoritme
Alle rekursive algoritmer må ha følgende:
-
Base Case (dvs., når du skal stoppe)
-
Arbeide mot Base Case
-
Rekursive Kall (dvs., ring oss selv)
«arbeid mot base case» er der vi vil gjøre problemet enklere (f.eks., dele listen i to deler, hver mindre enn den opprinnelige). Den rekursive kall, er der vi bruke samme algoritme for å løse en enklere versjon av problemet., Base case er løsningen på den «enkleste» mulig problem (For eksempel base case i problemet ‘finner det største tallet i en liste’ ville være hvis listen hadde bare ett tall… og av definisjonen hvis det er bare ett tall, det er den største).
Enkelt Eksempel: Legg til tre tall
lagt til tre tall er det samme som å legge til de to første tallene, og deretter legge til disse to tallene igjen.
(Merk, i Matlab, en funksjon som kan kalles uten alle argumenter. Den nargin funksjonen forteller datamaskinen hvor mange verdier som ble spesifisert., Dermed add_numbers(1) ville ha en nargin 1; add_numbers(1,1) ville ha en nargin 2; add_numbers(1,1,1) ville ha en nargin av 3.)
Identifisere 3 deler av den rekursive algoritmen:
Alle rekursiv algoritme må ha de følgende tre faser:
Hvorfor Recursion Fungerer
I en rekursiv algoritme, datamaskinen «husker» alle tidligere tilstand av problemet. Denne informasjonen er «holdt» av datamaskinen på «aktivering stack» (dvs., innsiden av hver funksjon arbeidsområdet).
Hver funksjon har sin egen arbeidsplass PER SAMTALE for funksjonen.,
Labyrint Eksempel:
Vurdere et rektangel rutenett av rom, der hvert rom kan eller ikke kan ha dører på Nord -, Sør -, Øst-og Vest-sider.
Hvordan kan du finne veien ut av en labyrint? Her er en mulig «algoritme» for å finne svaret:
For hver dør i det aktuelle rommet, hvis døren fører til exit, ta av døren.
«lure» her er selvfølgelig, hvordan vet vi om den dør som leder til et rom som fører til exit? Svaret er vi ikke, men vi kan la datamaskinen finne det ut for oss.
Hva er rekursiv del om det over algoritme?, Det er den «dør fører ut av labyrinten». Hvordan vet vi om en dør som fører ut av labyrinten? Vi vet det fordi inne i rommet ved siden av (gå gjennom døren), vi spør det samme spørsmålet, hvordan kan vi komme ut av labyrinten?
Det som skjer, er datamaskinen «husker» alle «what ifs». Hva hvis jeg tar den første døren, hva hvis jeg tar den andre døren, hva hvis jeg tar den neste døren, etc. Og for alle mulige døren kan du flytte deg gjennom, datamaskinen husker de hva ifs, og for hver dør etter det, og etter det, osv, til slutt blir funnet.
Her er en nær selve koden gjennomføring.,
Spørsmål: Hva er base case ovenfor?
Svar: (Det var et lurespørsmål) Det er ingen base case i koden. Du trenger å checke ved starten hvis rommet er det exit. Hvis det er det, ingen recursion!
function success = find_way_out( maze, room ) if room is exit → return true room ← mark as visited % rest of code ... end
Spørsmål: Hvordan kan du merke det rommet som besøkte?
Svar: Det finnes ulike teknikker. Hvis rommet er en struktur (eller objektet)du kan legge besøkte feltet retning til rommet. (f.eks., rom.besøkt = true;)Hvis du ikke bruker objekter, kan du ha en matrise av boolske flagg som isthe samme størrelse/form som maze, og bruke disse verdiene.,
Spørsmål: Er det andre problemer med over-algoritmen?
Svar: svaret på Det kan bli funnet ved å tenke over følgende spørsmål: Hva ville skje hvis labyrinten var en gigantisk rutenett med identisk størrelse rektangulære rom, hvert med dører på hver vegg? Tenk deg at du går Nordover gjennom den første døren, deretter Øst gjennom de neste rom døren, så Sørover gjennom at rom døren, og så Vestover gjennom at rom døren. Hvor du ender opp? Tilbake der du startet! Verre, kan du fortsette å gjøre dette sløyfe for alltid. Hvordan ville en uredd eventyrer løse dette problemet?,
Ett svar til det er ved hjelp av et stykke kritt og sette en stor X på gulvet i alle rom du enter. Dermed når du kommer tilbake til et rom med en X på gulvet, vet du at du ikke trenger å skrive inn. I tilfelle av programmet, en boolsk flagg «sett» eller «besøkte» bør brukes. Hvert rom har et flagg. Alle rommene starter med flagget blir satt til false. Når du besøker et rom, har du sett flagget til true., Til slutt, i «base case» du har en linje som for eksempel:
function success = find_way_out( maze, room ) % exit chack if room is visited → return false % rest of code ... end
Recursion kan være like godt brukes til datamaskinen algoritmer:
Noen Datamaskin relatert eksempler inkluderer: Legge til en liste av tall, Databehandling av Fibonacci-sekvensen, databehandling et Fakultet, og Sudoku.
Loops og Hale Recursion
Noen rekursive algoritmer er svært lik looper. Disse algoritmene er kalt «hale rekursiv» fordi den siste setningen i algoritmen er å «starte på nytt» algoritmen. Halen rekursive algoritmer kan være direkte oversatt til looper.
Legg igjen en kommentar