Recursion este procesul de definire a unei probleme (sau soluția la o problemă) în termeni de (o versiune mai simplă a) în sine. de exemplu, putem defini operația „găsiți-vă drumul spre casă” ca:
-
Dacă sunteți acasă, opriți mișcarea.
-
faceți un pas spre casă.
-
„găsește – ți drumul spre casă”. aici soluția pentru a găsi drumul spre casă este de doi pași (trei pași). În primul rând, nu mergem acasă dacă suntem deja acasă., În al doilea rând, facem o acțiune foarte simplă care face ca situația noastră să fie mai simplă de rezolvat. În cele din urmă, refacem întregul algoritm. exemplul de mai sus se numește recursivitate coadă. Acesta este locul în care ultima afirmație apelează algoritmul recursiv. Recursiunea cozii poate fi tradusă direct în bucle.
cum ați scrie un „algoritm” recursiv pentru a găsi piața Templului? un alt exemplu de recursivitate ar fi găsirea valorii maxime într-o listă de numere. Valoarea maximă dintr-o listă este fie primul număr, fie cel mai mare dintre numerele rămase., Iată cum ne-ar scrie pseudocod a algoritmului:
Părți ale unui Algoritm Recursiv
Toate algoritmi recursive trebuie să aibă următoarele caracteristici:
-
Caz de Bază (de exemplu, atunci când pentru a opri)
-
de Muncă față de Cazul de Bază
-
Apel Recursiv (de exemplu, ne numim)
„De lucru față de cazul de bază” este în cazul în care avem de a face problema mai simple (de exemplu, împărțiți lista în două părți, fiecare mai mic decât originalul). Apelul recursiv, este în cazul în care vom folosi același algoritm pentru a rezolva o versiune mai simplă a problemei., Cazul de bază este soluția la „cea mai simplă” problemă posibilă (de exemplu, cazul de bază din problema „găsiți cel mai mare număr dintr-o listă” ar fi dacă lista ar avea un singur număr… și prin definiție, dacă există un singur număr, este cel mai mare).
exemplu simplu: adăugați trei numere
adăugarea a trei numere este echivalentă cu adăugarea primelor două numere și apoi adăugarea din nou a acestor două numere.
(notă, în Matlab, o funcție poate fi apelată fără toate argumentele. Funcția nargin spune computerului câte valori au fost specificate., Astfel add_numbers(1) ar fi o nargin de 1; add_numbers(1,1) ar avea un nargin de 2; add_numbers(1,1,1) ar avea un nargin de 3.)
identificați cele 3 părți ale algoritmului recursiv:
toate algoritmul recursiv trebuie să aibă următoarele trei etape:
de ce funcționează recursivitatea
într-un algoritm recursiv, computerul „își amintește” fiecare stare anterioară a problemei. Aceste informații sunt „deținute” de computer în „stiva de activare” (adică în interiorul fiecărui spațiu de lucru al funcțiilor). fiecare funcție are propriul spațiu de lucru pentru fiecare apel al funcției., luați în considerare o grilă dreptunghi de camere, în cazul în care fiecare cameră poate sau nu poate avea uși de pe laturile de Nord, Sud, Est și Vest.
cum îți găsești drumul dintr-un labirint? Iată un posibil „algoritm” pentru găsirea răspunsului:
pentru fiecare ușă din camera curentă, dacă ușa duce la ieșire, luați acea ușă.
„trucul” aici este, desigur, cum știm dacă ușa duce la o cameră care duce la ieșire? Răspunsul este că nu, dar putem lăsa computerul să ne dea seama.
care este partea recursivă despre algoritmul de mai sus?, Ei „ușa duce din labirint”. De unde știm dacă o ușă iese din labirint? Știm pentru că în camera alăturată (trecând prin ușă), punem aceeași întrebare, cum ieșim din labirint?
ce se întâmplă este computerul „își amintește” toate „Ce este dacă”. Ce se întâmplă dacă iau prima ușă, ce se întâmplă dacă iau a doua ușă, ce se întâmplă dacă iau ușa următoare, etc. Și pentru fiecare ușă posibilă pe care o puteți deplasa, computerul își amintește de cele care sunt, și pentru fiecare ușă după aceea, și după aceea, etc, până când se găsește sfârșitul.
aici este aproape de punerea în aplicare a codului real.,
întrebare: care este cazul de bază de mai sus?
răspuns: (asta a fost o întrebare truc) nu există nici un caz de bază în codul. Trebuie să verificați la început dacă camera este ieșirea. Dacă este, nici o recursivitate!
function success = find_way_out( maze, room ) if room is exit → return true room ← mark as visited % rest of code ... end
întrebare: cum marcați camera ca vizitată? răspuns: Există diferite tehnici. Dacă camera este o structură (sau obiect), puteți adăuga direcția câmpului vizitat în cameră. (de exemplu, cameră.vizitat = true;) dacă nu utilizați obiecte, ați putea avea o matrice de steaguri booleene care este aceeași dimensiune / formă ca labirint și de a folosi aceste valori.,
întrebare: sunt celelalte probleme cu algoritmul de mai sus? Răspuns: Răspunsul poate fi găsit gândindu-ne la următoarea întrebare: Ce s-ar întâmpla dacă labirintul ar fi o grilă uriașă de camere dreptunghiulare de dimensiuni identice, fiecare cu uși pe fiecare perete? Imaginați-vă că mergeți spre nord prin prima ușă, apoi spre est prin următoarea ușă a camerelor, apoi spre sud prin acea ușă a camerelor și apoi spre vest prin acea ușă a camerelor. Unde ajungi? Înapoi de unde ai început! Mai rău, s-ar putea continua să facă această buclă pentru totdeauna. Cum ar rezolva un aventurier îndrăzneț această problemă?,
un răspuns la asta este folosind o bucată de cretă și punând un X mare pe podeaua fiecărei camere în care intri. Astfel, atunci când te întorci într-o cameră cu un X pe podea, știi că nu trebuie să intri. În cazul programului, ar trebui folosit un steag boolean „văzut” sau „vizitat”. Fiecare cameră are un steag. Fiecare cameră începe cu steagul fiind setat la fals. Când vizitați o cameră, setați steagul pe true., În cele din urmă, în „de bază” ai o linie, cum ar fi:
function success = find_way_out( maze, room ) % exit chack if room is visited → return false % rest of code ... end
Recursivitatea poate fi la fel de bine aplicat algoritmi de calculator:
Unele legate de Calculator exemplele includ: Adăugarea o listă de numere, de Calcul șirul lui Fibonacci, un calcul Factorial, și Sudoku.
bucle și coada Recursivitate
unii algoritmi recursive sunt foarte similare cu bucle. Acești algoritmi sunt numiți „coada recursiv”, deoarece ultima declarație în algoritmul este de a” reporni ” algoritmul. Coada algoritmi recursive pot fi traduse direct în bucle.
-
Lasă un răspuns