rekursion er processen med at definere et problem (eller løsningen på et problem) i form af (en enklere version af) selv.
for eksempel kan vi definere handlingen “find vej hjem” som:
-
Hvis du er hjemme, skal du stoppe med at flytte.
-
Tag et skridt mod hjemmet.
-
“find vej hjem”.
Her er løsningen på at finde vej hjem to trin (tre trin). For det første går vi ikke hjem, hvis vi allerede er hjemme., For det andet gør vi en meget enkel handling, der gør vores situation enklere at løse. Endelig gentager vi hele algoritmen.
ovenstående eksempel kaldes hale rekursion. Det er her den allerførste erklæring kalder den rekursive algoritme. Hale rekursion kan direkte oversættes til sløjfer.
hvordan ville du skrive en rekursiv “algoritme” til at finde Temple s ?uare?
et andet eksempel på rekursion ville være at finde den maksimale værdi i en liste over tal. Den maksimale værdi i en liste er enten det første tal eller det største af de resterende tal., Her er, hvordan vi ville skrive pseudocode af algoritme:
Dele af en Rekursiv Algoritme
Alle rekursive algoritmer skal have følgende:
-
Base Case (dvs, hvornår de skal stoppe)
-
Arbejde mod Base Case
-
Rekursive Kald (dvs, ring til os selv)
“arbejde mod base case” er der, hvor vi gør problemet enklere (fx, opdele listen i to dele, hver mindre end det oprindelige). Det rekursive opkald er, hvor vi bruger den samme algoritme til at løse en enklere version af problemet., Basissagen er løsningen på det “enkleste” mulige problem (for eksempel ville basissagen i problemet ‘find det største antal på en liste’ være, hvis listen kun havde et nummer… definition, hvis der kun er et tal, er det det største).
Simpelt Eksempel: Tilføj tre numre
Tilføjelse af tre tal svarer til at tilføje de to første numre, og derefter tilføje disse to numre igen.
(Bemærk, i Matlab kan en funktion kaldes uden alle argumenterne. Nargin-funktionen fortæller computeren, hvor mange værdier der blev specificeret., Således add_numbers(1) ville have en nargin 1; add_numbers(1,1) ville have en nargin af 2; add_numbers(1,1,1) ville have en nargin af 3.)
Identificere 3 dele af den rekursive algoritme:
Alle rekursiv algoritme, skal have følgende tre faser:
Hvorfor Rekursion Værker
I en rekursiv algoritme, computeren “husker” alle tidligere tilstand af problemet. Denne information “holdes” af computeren på “activation stack” (dvs.inde i hver funktioner arbejdsområde).
hver funktion har sit eget arbejdsområde pr.,
labyrint eksempel:
overvej et rektangelgitter af værelser, hvor hvert værelse måske eller måske ikke har døre på Nord -, Syd -, Øst-og Vestsiden.
hvordan finder du vej ud af en labyrint? Her er en mulig “algoritme” til at finde svaret:
for hver dør i det aktuelle rum, hvis døren fører til udgangen, skal du tage den dør.
“tricket” her er selvfølgelig, hvordan ved vi, om døren fører til et rum, der fører til udgangen? Svaret er, at vi ikke gør det, men vi kan lade computeren finde ud af det for os.
Hvad er den rekursive del om ovenstående algoritme?, Dens “døren fører ud af labyrinten”. Hvordan ved vi, om en dør fører ud af labyrinten? Vi ved, fordi inde i det næste rum (går gennem døren), stiller vi det samme spørgsmål, Hvordan kommer vi ud af labyrinten?
hvad der sker er computeren “husker” alle “hvad hvis”. Hvad hvis jeg tager den første dør, hvad hvis jeg tager den anden dør, hvad hvis jeg tager den næste dør osv. Og for enhver mulig dør kan du bevæge dig igennem, computeren husker dem, hvad hvis, og for hver dør efter det, og efter det osv., indtil slutningen er fundet.
Her er en tæt på faktiske kode implementering.,
spørgsmål: Hvad er basissagen ovenfor?
svar: (det var et trick spørgsmål) der er ingen base tilfælde i koden. Du skal tjekke i starten, hvis rummet er udgangen. Hvis det er, ingen rekursion!
function success = find_way_out( maze, room ) if room is exit → return true room ← mark as visited % rest of code ... end
spørgsmål: Hvordan markerer du rummet som besøgt?
svar: der er forskellige teknikker. Hvis rummet er en struktur (eller objekt), kan du tilføje den besøgte feltretning til rummet. (f room værelse.besøgte = true;) hvis du ikke bruger objekter, kan du have en Matri.af Boolske flag, der er den samme størrelse/form som labyrinten og bruge disse værdier., spørgsmål: er de andre problemer med ovenstående algoritme?
svar: svaret på det kan findes ved at tænke på følgende spørgsmål: Hvad ville der ske, hvis labyrinten var et kæmpe gitter af identisk størrelse rektangulære rum, hver med døre på hver væg? Forestil dig, at du går nord gennem den første dør, derefter øst gennem den næste værelsesdør, derefter syd gennem den værelsesdør, og derefter vest gennem den værelsesdør. Hvor ender du? Tilbage hvor du startede! Værre, du kan fortsætte med at gøre denne løkke for evigt. Hvordan ville en frygtløs eventyrer løse dette problem?,
et svar på det er ved at bruge et stykke kridt og sætte et stort X på gulvet i hvert rum, du indtaster. Således når du kommer tilbage til et værelse med et X på gulvet, ved du, at du ikke behøver at komme ind. I tilfælde af programmet skal der bruges et boolsk flag “set” eller “besøgt”. Hvert værelse har et flag. Hvert værelse starter med flaget bliver sat til falsk. Når du besøger et værelse, du indstille flaget til sand., Endelig har du i “basissagen” en linje som:
function success = find_way_out( maze, room ) % exit chack if room is visited → return false % rest of code ... end
rekursion kan anvendes lige så godt til computeralgoritmer:
nogle computerrelaterede eksempler inkluderer: tilføjelse af en liste over tal, beregning af Fibonacci-sekvensen, beregning af en Factorial og Sudoku.
sløjfer og hale rekursion
nogle rekursive algoritmer ligner meget sløjfer. Disse algoritmer kaldes “hale rekursiv”, fordi den sidste sætning i algoritmen er at “genstarte” algoritmen. Hale rekursive algoritmer kan oversættes direkte til sløjfer.
Skriv et svar