Când scriu ceva despre recursivitate, mi-l amintesc pe marele meu profesor Dragoş VAIDA care prezenta formulele lui CRAMER şi ale lui GAUSS pentru rezolvarea sistemelor liniare de ecuaţii. Mi se părea fascinant să ai Xn+1 = F(Xn) + A. Exemplificările sale folosind limbajul ALGOL 67 erau fabuloase. M-am desumflat când am programat în limbajele FORTRAN şi COBOL unde recursivitatea nu exista. Trecând la limbajele PASCAL şi C++ deja se vedea eleganţa soluţiilor privind probleme unde recursivitatea este la ea acasă. Prima întrebare pe care mi-am pus-o când am început să lucrez în PYTHON a fost dacă este implementată facilitatea legată de construirea de funcţii recursive. M-am liniştit când am văzut calculul factoriualului de n în mod recursiv. Deja am scris şi eu un program pentru a vedea ce şi cum e cu recursivitatea în PYTHON. Nimic nou sub soare.
Cine a scris funcţii recursive în C++ sau PASCAL, va scrie rapid funcţii recursive în PYTHON.
Programul de mai jos exemplifică modul de construire a funcţiilor recursive pentru câteva probleme clasice deja cum sunt:
- calculul factorialului de n,
- calculul unei sume de numere consecutive,
- generare termeni şir FIBONACCI,
- ridicare la putere,
- calculul sumei elementelor dintr-o listă.
Recursivitatea înseamnă autoreferirea funcţiei construite cu def în chiar interiorul ei, folosndu-i numele şi parametri care să asigure punerea pe stivă în mod corect a valorilor care prin traversarea stivei să permită efectuarea corectă a calculelor. Important este să se identifice argumentele de la autoapel şi să se calculeze valoarea de start pentru nivelul particular al parametrului, se zicem valoarea zero sau primul termen din şirul generat recursiv.
Programul de mai jos exemplifică folosirea recursivităţii este:
# *******************************************************
# Funcţii recursive
# Funcţia recursiva factorial(n) calcul n!
# Funcţia recursiva Suma_vector insumeaza elementele unui sir
# Funcţia recursiva Fibonacci(n) genereaza elementele sir Fibonacci
# Funcţia recursiva Ridicare_putere(numar, exponent) ridica un numar la
# o putere data
# ***************** Funcţii recursive ***************
def factorial(n):
if n > 10 or n < 1:
return -1
if n == 1:
return 1
else:
return (n * factorial(n - 1))
def Suma_vector(x, n):
if n > 0:
suma = x[n] + Suma_vector(x, n - 1)
else:
suma = x[0]
return suma
def Fibonacci(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return Fibonacci(n - 1) + Fibonacci(n - 2)
def Ridicare_putere(numar, exponent):
if exponent == 0:
return 1
else:
return numar * Ridicare_putere(numar, exponent - 1)
# **********************Apelare funcţii recursive *******
i = 1
while i < 10:
N = factorial(i)
print('Factorial de ', i, 'este ', N)
i = i +1
X = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Nr_elem = len(X)
Total_vector = Suma_vector(X, Nr_elem - 1)
print( 'Vectorul este: ', X)
print( 'Suma componentelor vectorului este: ', Total_vector)
i = 0
while i < 10:
N = Fibonacci(i)
print('Termenul ', i+1, 'al sirului Fibonacci este: ', N)
i = i +1
Exp = 5
i = 0
while i <= 10:
N = Ridicare_putere(i, Exp)
print('Numarul ', i, 'ridicat la puterea ', Exp, 'este ', N )
i = i +1
|
|
Rezultatul afişat este:
Factorial de 1 este 1
Factorial de 2 este 2
Factorial de 3 este 6
Factorial de 4 este 24
Factorial de 5 este 120
Factorial de 6 este 720
Factorial de 7 este 5040
Factorial de 8 este 40320
Factorial de 9 este 362880
Vectorul este: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
Suma componentelor vectorului este: 55
Termenul 1 al sirului Fibonacci este: 0
Termenul 2 al sirului Fibonacci este: 1
Termenul 3 al sirului Fibonacci este: 1
Termenul 4 al sirului Fibonacci este: 2
Termenul 5 al sirului Fibonacci este: 3
Termenul 6 al sirului Fibonacci este: 5
Termenul 7 al sirului Fibonacci este: 8
Termenul 8 al sirului Fibonacci este: 13
Termenul 9 al sirului Fibonacci este: 21
Termenul 10 al sirului Fibonacci este: 34
Numarul 0 ridicat la puterea 5 este 0
Numarul 1 ridicat la puterea 5 este 1
Numarul 2 ridicat la puterea 5 este 32
Numarul 3 ridicat la puterea 5 este 243
Numarul 4 ridicat la puterea 5 este 1024
Numarul 5 ridicat la puterea 5 este 3125
Numarul 6 ridicat la puterea 5 este 7776
Numarul 7 ridicat la puterea 5 este 16807
Numarul 8 ridicat la puterea 5 este 32768
Numarul 9 ridicat la puterea 5 este 59049
Numarul 10 ridicat la puterea 5 este 100000
Pe Internet sunt multe exemple de folosire a recursivităţii în PYTHON.Venind din programarea în ASSEMBLER, pentru mine a fost lejeră folosirea recursivităţii pentru că i-am înţeles mecanismele în detaliu.
(afişat azi 15 aprilie 2022 ora 10,20)
|