⊗pyPmFnRe 24 of 129 menu

Rekursion i Python

I programmering finnes det et konsept kalt rekursion - når en funksjon kaller seg selv.

Eksempel . Enkel rekursion med teller

La oss skrive ut tall fra 1 til 10 ved hjelp av rekursion:

i = 1 def func(): global i print(i) i += 1 if i <= 10: func() # her kaller funksjonen seg selv func()

La oss diskutere hvordan denne koden fungerer.

Vi har en global variabel i og en funksjon func, inni der innholdet av variabelen i skrives ut til konsollen, og deretter økes den med én.

Hvis variabelen vår i er mindre enn eller lik 10, kalles funksjonen på nytt. Siden variabelen i er global, vil den for hvert nye funksjonskall ha verdien som ble satt i forrige kall av variabelen i.

Resultatet blir at funksjonen vil kalle seg selv inntil i blir større enn 10.

Vær oppmerksom på at i vårt tilfelle kan ikke funksjonen startes uten if - hvis dette gjøres, vil det resultere i et uendelig rekursivt kall av funksjoner.

Eksempel . Rekursion for å skrive ut elementer i nestede lister

Rekursion brukes mest ofte for å gå gjennom lister med ulike nivåer av nesting. La oss si at vi har følgende liste:

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

La oss lage en funksjon som går gjennom den. I den må vi først sette en betingelse for at et element som er en primitiv, dvs. bare et tall hentet fra listen, skal skrives ut til konsollen. Og hvis elementet er et komplekst objekt, for eksempel en nested liste, la funksjonen i dette tilfellet kalle seg selv, dvs. det vil skje en rekursion. For å sjekke typen av element bruker vi funksjonen isinstance. Bare for vårt eksempel skriver vi el i den første parameteren til isinstance, og den andre - typen list:

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

Når funksjonen kalles, vil en rekke med alle tallene fra den nestede listen bli skrevet ut:

func(lst) # skriver ut 1, 2, ... 8, 9

Eksempel . Rekursion for operasjoner med elementer i nestede lister

Rekursion kan også brukes for ulike operasjoner med elementer i nestede lister. La oss si at vi har følgende liste:

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

La oss finne summen av alle dens elementer. For å gjøre dette, deklarerer vi en variabel res i funksjonen, der summen av tallene vil akkumuleres. I betingelsen spesifiserer vi at hvis elementet er et komplekst objekt, går det inn i parameteren til funksjonen func og legges til i summen. Dette betyr at elementet vil være i rekursion inntil det blir en primitiv. Og i dette tilfellet vil det bare legges til summen som er skrevet i res:

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

La oss kalle funksjonen og skrive ut dens resultat til konsollen:

print(func(lst)) # skriver ut 45

Eksempel . Rekursion for akkumulering i en liste

Med rekursion kan du pakke ut nestede lister til én endimensjonal liste. La oss si at vi har følgende liste:

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

La oss definere en tom liste res i funksjonen, der elementene fra kildelisten vil akkumuleres. Deretter starter vi en løkke og setter en betingelse - hvis elementet er en liste, går det inn i metoden extend. Denne metoden kobler sammen elementene i én liste på slutten av en annen liste, dvs. elementene i den nestede listen vil havne på slutten av listen 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))

Resultatet av den utførte koden:

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

Praktiske oppgaver

Skriv ut alle numeriske elementer i en ordbok med vilkårlig nivå av nesting:

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

Finn summen av elementene i ordboken fra forrige oppgave.

Få en liste over de primitive elementene i ordboken fra forrige oppgave.

Norsk
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Vi bruker informasjonskapsler for nettstedets funksjonalitet, analyse og personalisering. Behandling av data foregår i henhold til Personvernerklæringen.
godta alle tilpass avvis