⊗pyPmFnRe 24 of 129 menu

Recursivitate în Python

În programare există un concept numit recursivitate - atunci când o funcție se autoapelează.

Exemplu . Recursivitate simplă cu contor

Să afișăm numerele de la 1 la 10 folosind recursivitatea:

i = 1 def func(): global i print(i) i += 1 if i <= 10: func() # aici funcția se autoapelează func()

Să discutăm cum funcționează acest cod.

Avem variabila globală i și funcția func, în interiorul căreia se afișează în consolă conținutul variabilei i, apoi i se adaugă o unitate.

Dacă variabila noastră i este mai mică sau egală cu 10, atunci funcția este apelată din nou. Deoarece variabila i este globală, la fiecare nou apel al funcției va conține valoarea stabilită la apelul anterior.

Se va întâmpla ca funcția să se autoapeleze până când i devine mai mare decât 10.

Rețineți că în cazul nostru nu putem apela funcția fără if - dacă facem acest lucru, vom obține un apel infinit de funcții.

Exemplu . Recursivitate pentru afișarea elementelor din liste imbricate

Cel mai des recursivitatea este aplicată pentru parcurgerea listelor cu diferite grade de imbricare. Să presupunem că avem următoarea listă:

lst = [1, [2, 3], [[4, 5], [6, 7, 8, [9]]]]

Să creăm o funcție care o va parcurge. În ea trebuie mai întâi să stabilim o condiție ca elementul care este un primitiv, adică un număr extras simplu din listă, să fie afișat în consolă. Iar dacă elementul este un obiect complex, de exemplu o listă imbricată, atunci în acest caz funcția să se autoapeleze, adică să aibă loc recursivitatea. Pentru verificarea tipului elementului vom folosi funcția isinstance. Doar pentru exemplul nostru în primul parametru al isinstance vom scrie el, iar al doilea - tipul list:

def func(lst): for el in lst: if isinstance(el, list): func(el) else: print(el)

La apelarea funcției se va afișa șirul tuturor numerelor din lista imbricată:

func(lst) # va afișa 1, 2, ... 8, 9

Exemplu . Recursivitate pentru operații cu elemente din liste imbricate

Recursivitatea poate fi aplicată și pentru diverse operații cu elementele din liste imbricate. Să presupunem că avem următoarea listă:

lst = [1, [2, 3], [[4, 5], [6, 7, 8, [9]]]]

Să obținem suma tuturor elementelor sale. Pentru aceasta, în funcție vom declara variabila res, în care se va acumula suma numerelor. În condiție vom specifica că dacă elementul este un obiect complex, atunci acesta intră ca parametru al funcției func și se adaugă la sumă. Aceasta înseamnă că elementul va fi prelucrat recursiv până devine primitiv. Și în acest caz el va fi pur și simplu adăugat la suma scrisă în res:

def func(lst): res = 0 for el in lst: if isinstance(el, list): res += func(el) else: res += el return res

Să apelăm funcția și să afișăm rezultatul ei în consolă:

print(func(lst)) # va afișa 45

Exemplu . Recursivitate pentru acumulare în listă

Cu ajutorul recursivității putem desfășura listele imbricate într-o singură listă unidimensională. Să presupunem că avem următoarea listă:

lst = [1, [2, 3], [[4, 5], [6, 7, 8, [9]]]]

Să specificăm în funcție o listă goală res, în care se vor acumula elementele listei inițiale. Apoi vom porni un ciclu și vom stabili o condiție - dacă elementul este o listă, atunci acesta va intra în metoda extend. Această metodă atașează elementele unei liste la sfârșitul celei de-a doua liste, adică elementele listei imbricate vor fi adăugate la sfârșitul listei res:

def func(lst): res = [] for el in lst: if isinstance(el, list): res.extend(func(el)) else: res.append(el) return res print(func(lst))

Rezultatul codului executat:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

Probleme practice

Afișați toate elementele numerice ale unui dicționar cu un nivel arbitrar de imbricare:

{ 'a': { 'b': 1, 'c': 2, 'd': { 'e': 3, 'f': 4 } }, 'j': { 'h': 5, 'k': 6, }, 'l': 7 }

Găsiți suma elementelor dicționarului din problema anterioară.

Obțineți lista elementelor primitive ale dicționarului din problema anterioară.

Română
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Folosim cookie pentru funcționarea site-ului, analiză și personalizare. Prelucrarea datelor are loc în conformitate cu Politica de confidențialitate.
acceptă toate configurează respinge