Treci la conținutul principal

O funcție care se apelează pe ea însăși folosește recursivitatea.

Ideea apare peste tot, atât în matematică, cât și în programare. Avantajul ei este că o funcție poate parcurge datele până când ajunge la un rezultat.

Ai grijă când scrii o astfel de funcție, pentru că ajungi ușor la una care nu se oprește niciodată sau care consumă prea multă memorie sau putere de procesare. Totuși, scrisă corect, recursivitatea este un mod eficient și elegant din punct de vedere matematic de a programa.

Exemplu

O numărătoare inversă recursivă care începe de la 5:

Prompt
Scrie un program Python care definește o funcție recursivă countdown(n) ce afișează numerele de la n până la 1, apoi afișează „Gata!”. Apelează funcția cu 5.
Ieșire: program Python complet

Cazul de bază și cazul recursiv

Orice funcție recursivă are nevoie de două părți:

  • Cazul de bază - Condiția care încheie recursivitatea
  • Cazul recursiv - Punctul în care funcția se apelează pe ea însăși cu un argument modificat

Dacă elimini cazul de bază, funcția continuă să se apeleze pe ea însăși până când Python o oprește cu o eroare de recursivitate.

Aici nimic nu contează mai mult decât cazul de bază, așa că verifică întotdeauna că la condiția lui se va ajunge mai devreme sau mai târziu.

Exemplu

Identificarea cazului de bază și a cazului recursiv:

Prompt
Scrie un program Python care definește o funcție recursivă factorial(n), cu un caz de bază care returnează 1 pentru n==0 sau n==1 și un caz recursiv care returnează n * factorial(n-1). Afișează factorialul lui 5.
Ieșire: program Python complet

Șirul lui Fibonacci

Un exemplu clasic de recursivitate este șirul lui Fibonacci. Începe cu 0 și 1, iar fiecare număr următor este ce obții adunând cele două numere dinaintea lui:

0, 1, 1, 2, 3, 5, 8, 13 și așa mai departe.

Șirul nu are sfârșit, iar aceeași regulă de adunare se aplică pe tot parcursul lui.

Cu recursivitatea, putem calcula orice număr ales din șir:

Exemplu

Găsește numărul de la poziția 7 din șirul lui Fibonacci, numărând de la 0:

Prompt
Scrie un program Python care definește o funcție recursivă fibonacci(n) care returnează n dacă n<=1, altfel fibonacci(n-1) + fibonacci(n-2). Afișează al 7-lea număr Fibonacci.
Ieșire: program Python complet

Recursivitatea cu liste

O listă poate fi prelucrată recursiv, tratând un singur element la fiecare apel:

Exemplu

Adună toate elementele unei liste:

Prompt
Scrie un program Python care definește o funcție recursivă sum_list(numbers) care returnează 0 pentru o listă goală, altfel returnează numbers[0] + sum_list(numbers[1:]). Testeaz-o cu [1, 2, 3, 4, 5] și afișează rezultatul.
Ieșire: program Python complet

Exemplu

Găsește cea mai mare valoare dintr-o listă:

Prompt
Scrie un program Python care definește o funcție recursivă find_max(numbers) care returnează numbers[0] pentru o listă cu un singur element, altfel compară numbers[0] cu maximul restului listei. Testeaz-o cu [3, 7, 2, 9, 1] și afișează rezultatul.
Ieșire: program Python complet

Limita de adâncime a recursivității

În Python, recursivitatea poate merge doar până la o anumită adâncime. Implicit, limita este de obicei în jur de 1000 de apeluri recursive.

Poți mări această limită dacă ai nevoie de mai multă adâncime, dar astfel programul tău s-ar putea bloca.

Așadar, mărește-o cu grijă, iar pentru o recursivitate foarte adâncă ia în considerare folosirea iterației.

Exemplu

Afișează limita de recursivitate curentă:

Prompt
Scrie un program Python care importă sys și afișează limita de recursivitate folosind sys.getrecursionlimit().
Ieșire: program Python complet
main.py
import sys
sys.setrecursionlimit(2000)
print(sys.getrecursionlimit())