Pentru a arăta modalități mai avansate de utilizare a funcțiilor, vom face acum o parcurgere pentru următorul program:
def mult(a, b):
if b == 0:
return 0
rest = mult(a, b - 1)
value = a + rest
return value
result = mult(3, 2)
print("3 * 2 = ", result)
Practic, acest program creează o funcție de multiplicare a numărului întreg pozitiv (care este mult mai lentă decât funcția de multiplicare încorporată) și apoi demonstrează această funcție folosind funcția. Acest program demonstrează utilizarea recursiunii, adică o formă de iterație (repetiție) în care există o funcție care se autoinvocă în mod repetat până când o condiție de ieșire este îndeplinită. Utilizează adunări repetate pentru a da același rezultat ca și înmulțirea: de ex. 3 + 3 (adunare) oferă același rezultat ca 3 * 2 (înmulțire).
Întrebare: Care este primul lucru pe care îl face programul?
Răspuns: Primul lucru făcut este că funcția
este definită cu liniile:
mult
def mult(a, b):
if b == 0:
return 0
rest = mult(a, b - 1)
value = a + rest
return value
Aceasta creează o funcție care ia doi parametri și returnează o valoare când este finalizată. Mai târziu, această funcție poate fi rulată.
Ce se întâmplă mai departe?
Următoarea linie după funcție, result = mult(3, 2)
este rulată.
Ce face această linie?
Această linie va atribui valoarea returnată a lui mult(3, 2)
variabilei result
.
Și ce returnează mult(3, 2)
?
Trebuie să facem o prezentare a funcției mult
pentru a afla.
Ce se întâmplă mai departe?
Variabila a
primește valoarea 3 atribuită acesteia și variabila b
primește valoarea 2 atribuită acesteia.
Și apoi?
Linia if b == 0:
este rulată. Deoarece b
are valoarea 2, aceasta este falsă, astfel încât linia return 0
este omisă.
Și atunci ce?
Se rulează linia rest = mult(a, b - 1)
. Această linie setează variabila locală rest
la valoarea mult(a, b - 1)
. Valoarea lui a
este 3 și valoarea lui b
este 2, deci apelul funcției este mult(3,1)
Deci, care este valoarea lui mult(3,1)
?
Va trebui să rulăm funcția mult
cu parametrii 3 și 1.
Deci, ce se întâmplă în continuare?
Variabilele locale din noua rulare a funcției sunt setate astfel încât a
să aibă valoarea 3 și b
să aibă valoarea 1. Deoarece acestea sunt valori locale, acestea nu afectează valorile anterioare ale lui a
și b
.
Și apoi?
Deoarece b
are valoarea 1, declarația if este falsă, deci următoarea linie devine rest = mult(a, b - 1)
.
Ce face această linie?
Această linie va atribui mult(3, 0)
pentru rest.
Deci care este acea valoare?
Va trebui să rulăm funcția încă o dată pentru a afla asta. De data aceasta a
are valoarea 3 și b
are valoarea 0.
Deci, ce se întâmplă în continuare?
Prima linie din funcție de rulat este if b == 0:
.
are valoarea 0, astfel încât următoarea linie de rulat este
breturn 0
Și ce face linia return 0
?
Această linie returnează valoarea 0 din funcție.
Deci?
Deci acum știm că mult(3, 0)
are valoarea 0. Acum știm ce a făcut linia rest = mult(a, b - 1)
deoarece am rulat funcția mult
cu parametrii 3 și 0. Am terminat de rulat mult(3, 0)
și acum revenim la rularea mult(3, 1)
. Variabilei rest
i se atribuie valoarea 0.
Ce linie urmează?
Linia value = a + rest
este rulată în continuare. În această rulare a funcției, a = 3
și rest = 0
, deci acum value =
.
3
Ce se întâmplă mai departe?
Linia return value
este rulată. Aceasta returnează 3 din funcție. Aceasta iese și din rularea funcției mult(3, 1)
. După ce se apelează return
, revenim la rularea mult(3, 2)
.
Unde eram înmult(3, 2)
?
Am avut variabilele a = 3
și b = 2
și am examinat linia rest = mult(a, b - 1)
.
Deci ce se întâmplă acum?
Variabila rest
primește 3 alocat acestuia. Următoarea linie
setează valoarea la
value = a + rest3 + 3
sau 6.
Deci acum ce se întâmplă?
Următoarea linie rulează, aceasta returnează 6 din funcție. Acum revenim la rularea liniei result = mult(3, 2)
care acum poate atribui valoarea 6 variabilei result
.
Ce se întâmplă mai departe?
Următoarea linie după funcție, print("3 * 2 = ", result)
este rulată.
Și ce face aceasta?
Se imprimă 3 * 2 =
și valoarea rezultatului care este 6. Linia completă tipărită este 3 * 2 = 6
.
Ce se întâmplă în general?
Practic am folosit două fapte pentru a calcula multiplu al celor două numere. Primul este că orice număr multiplicat cu 0 este 0 (x * 0 = 0
). Al doilea este că un număr multiplicat cu un alt număr este egal cu primul număr plus primul număr multiplicat cu al doilea număr minus 1 (x
). Deci, ceea ce se întâmplă este că
* y = x + x * (y - 1)3 * 2
este mai întâi convertit în 3 + 3 * 1
. Apoi 3 * 1
este convertit în 3 + 3 * 0
. Apoi știm că orice număr multiplicat cu 0 este 0, deci 3 * 0
este 0. Atunci putem calcula că 3 + 3 * 0
este 3 + 0
care este 3
. Acum știm ce este 3 * 1
, astfel încât să putem calcula că 3 + 3 * 1
este 3 + 3
care este 6
.
Astfel funcționează totul:
mult(3, 2) 3 + mult(3, 1) 3 + 3 + mult(3, 0) 3 + 3 + 0 3 + 3 6
Recursiune
Constructele de programare care rezolvă o problemă prin rezolvarea unei versiuni mai mici a aceleiași probleme se numesc recursive. În exemplele din acest capitol, recursiunea este realizată prin definirea unei funcții care se autoapelează. Acest lucru facilitează implementarea soluțiilor la sarcinile de programare, deoarece poate fi suficient să luați în considerare următorul pas al unei probleme în loc de întreaga problemă deodată. De asemenea, este util, deoarece permite exprimarea unor concepte matematice cu un cod simplu, ușor de citit.
Orice problemă care poate fi rezolvată cu recursivitate ar putea fi reimplementată cu bucle. Utilizarea acestuia din urmă are ca rezultat o performanță mai bună. Cu toate acestea, implementările echivalente care utilizează bucle sunt de obicei mai greu de realizat corect.
Probabil cea mai intuitivă definiție a recursiunii este:
Recursiunea
Dacă tot nu îl înțelegi, vezi recursiunea.
Încercați să parcurgeți exemplul factorial dacă exemplul de multiplicare nu îl înțelegeți.
Exemple
factorial.py
#definește o funcție care calculează factorialul
def factorial(n):
if n == 0:
return 1
if n<0:
return "Error, negative numbers do not have factorial values!!"
return n * factorial(n - 1)
print("2! =", factorial(2))
print("3! =", factorial(3))
print("4! =", factorial(4))
print("5! =", factorial(5))
print("-3! =", factorial(-3))
Rexultat:
2! = 2 3! = 6 4! = 24 5! = 120 -3! = Error, negative values do not have factorial values!!
countdown.py
def count_down(n):
print(n)
if n > 0:
return count_down(n-1)
count_down(5)
Rezultat:
5 4 3 2 1 0
(Include texte din Wikibooks traduse și adaptate de Nicolae Sfetcu)
Lasă un răspuns