Problemin daha kiçik fraqmentlərə şaxələnməkdə davam etdiyi sonsuz görünən bir dövrədə tutulmusunuzmu?
Əgər belədirsə, siz rekursiyanın valehedici dünyasına düşmüş ola bilərsiniz. Anlamaq çətin görünsə də, narahat olmayın! Bu yazıda biz rekursiya növlərini öyrənmək üçün maraqlı bir səyahətə çıxacağıq.
Çoxsaylı rekursiv yanaşmaları araşdırarkən bağlanın. Rekursiyanın füsunkar səltənətinə girməyə hazırlaşın və mürəkkəb məsələlərin həllində onun heyrətamiz qabiliyyətini müşahidə edin.
Rekursiyalar tam olaraq nədir?
Əsas sözlə desək, rekursiya icra zamanı özünü çağıran funksiyanı ehtiva edən güclü proqramlaşdırma texnikasıdır. Bu, güzgüyə baxmaq və təsvirin içərisindəki təsviri görmək kimidir, nəticədə özünə istinad dövrü yaranır.
Rekursiyadan istifadə edərək böyük problemləri daha kiçik, daha idarə edilə bilən alt problemlərə bölmək yolu ilə həll edə bilərik.
Bu, tam bir şəkil yaratmaq üçün bir parçanın digər hissələrə bağlandığı bir Yapbozun yığılmasına bənzəyir. Rekursiya eyni təlimat dəstini müxtəlif girişlərlə təkrarlamaqla problemləri zərif və səmərəli şəkildə həll etməyə imkan verir.
1-Birbaşa Rekursiya
Birbaşa rekursiya, funksiyanın özünü birbaşa çağırdığı ən əsas rekursiya növüdür. Bu, problemli problemi əsas vəziyyətə çatana qədər daha kiçik alt problemlərə bölməyi nəzərdə tutur ki, bu da xitamla nəticələnir.
Rekursiv funksiya özünü müxtəlif girişlərlə çağırır və eyni təlimatlar dəstinin icrasını təkrar etməyə imkan verir. Hər bir çağırış əvvəlki birinə əsaslanır və tədricən rekursiyanın bitməsinə səbəb olan əsas işə yaxınlaşır.
Bu nümunəni yoxlayaq.
def countdown(n):
if n <= 0:
return
print(n)
countdown(n - 1)
countdown(5)
Çıxış:
5
4
3
2
1
2- Dolayı Rekursiya
Dolayı rekursiya rekursiv yola maraqlı bir bükülmə əlavə edir. Özünü açıq şəkildə çağıran bir funksiyanı ehtiva edən birbaşa rekursiyadan fərqli olaraq, dolayı rekursiya funksiya çağırışları zəncirini ehtiva edir.
Bir funksiya digərini çağırır, o, sonra orijinal funksiyanı və ya nəhayət orijinala qayıdan hər hansı digər funksiyanı çağıra bilər. Bu bir-birinə bağlı funksiya zəngləri şəbəkəsi bir problemi həll etmək üçün bir neçə funksiyanın əməkdaşlıq etdiyi valehedici rəqs yaradır.
Misal:
def function_A(n):
if n > 0:
print("A:", n)
function_B(n - 1)
def function_B(n):
if n > 0:
print("B:", n)
function_A(n - 1)
function_A(3)
Çıxış:
A: 3
B: 2
A: 1
3-Xətti Rekursiya
Məqsədinizə çatana qədər düz bir marşrutla bir addım atmağı düşünün. Bu ardıcıl texnika xətti rekursiya ilə təcəssüm olunur, burada bir funksiya hər bir funksiya iterasiyasında bir rekursiv çağırış yerinə yetirir.
Hər bir rekursiv çağırışla, rekursiv proses məsələnin ölçüsünü azaltmaqla əsas vəziyyətə yaxınlaşır. O, aydın və xətti şəkildə davam edir, son cavaba çatana qədər alt problemləri bir-bir həll edir.
Misal:
def factorial(n):
if n == 0:
return 1
return n * factorial(n - 1)
result = factorial(5)
print(result)
Çıxış:
120
4-Ağacların Rekursiyası
Funksiya bir neçə rekursiv çağırışa şaxələnəndə biz ağac rekursiyası dünyasına daxil oluruq. Ağacın rekursiyasındakı funksiya, ağacın budaqları kimi, hər biri ayrıca alt problemi həll edən çoxlu rekursiv çağırışlar yaradır.
Bu budaqlanan struktur mürəkkəb məsələləri effektiv şəkildə daha kiçik, bir-biri ilə əlaqəli komponentlərə ayıraraq bir neçə marşrutun eyni vaxtda araşdırılmasına imkan verir.
Misal:
def fibonacci(n):
if n <= 1:
return n
return fibonacci(n - 1) + fibonacci(n - 2)
result = fibonacci(6)
print(result)
Çıxış:
8
5-Nested Rekursiya
İç-içə rekursiya rekursiv kainata maraqlı bir mürəkkəblik dərəcəsi əlavə edir. Bu rekursiya formasında funksiya rekursiv çağırışı digər rekursiv çağırışda arqument kimi birləşdirir.
Daxili rekursiv çağırış xarici rekursiv çağırışdan asılı olan dəyərə təsir edir. Mürəkkəblik hər bir iç-içə çağırışla artır və daxili rekursiv zənglərin maraqlı nümunəsi ilə nəticələnir.
Misal:
def nested_recursion(n):
if n > 100:
return n - 10
return nested_recursion(nested_recursion(n + 11))
result = nested_recursion(95)
print(result)
Nəticə:
91
6-Quyruq rekursiyası
Quyruq rekursiyası rekursiv alqoritmlərin performansını yaxşılaşdıra bilən optimallaşdırma texnikasıdır. Rekursiv çağırış quyruq rekursiyası olan funksiyanın son hərəkəti kimi görünür.
Rekursiv çağırışdan sonra gözlənilməz əməliyyatlar olmadığı üçün kompilyator və ya tərcüməçi rekursiyanı sadə atlama ilə əvəz etməklə sadələşdirə bilər.
Quyruq çağırışının optimallaşdırılması kimi tanınan bu optimallaşdırma yanaşması hər bir rekursiv çağırış üçün yığın çərçivəsini saxlamaq tələbini azaldır, nəticədə sürətin artması və yaddaşın aşağı istifadəsi ilə nəticələnir.
Misal:
def tail_factorial(n, result=1):
if n == 0:
return result
return tail_factorial(n - 1, result * n)
result = tail_factorial(5)
print(result)
Çıxış:
120
7-Qeyri-quyruq rekursiya
Quyruq rekursiyasından fərqli olaraq, qeyri-quyruq rekursiya funksiya daxilində rekursiv çağırışdan sonra yerinə yetirilən əlavə fəaliyyətləri əhatə edir. Hər hansı daha çox hərəkət yerinə yetirilməzdən əvvəl hər bir rekursiv çağırış tamamlanmalı və geri qayıtmalıdır.
Nəticədə, əsas vəziyyətə çatana və rekursiya bitənə qədər, gözlənilməz əməliyyatlar yığını saxlanılır. Qeyri-quyruq rekursiya tez-tez daha çox yaddaş istifadə edir və quyruq rekursiyasından daha az səmərəlidir, lakin yenə də müxtəlif məsələlərin həlli üçün faydalı vasitədir.
Misal:
def non_tail_sum(n):
if n == 0:
return 0
return n + non_tail_sum(n - 1)
result = non_tail_sum(5)
print(result)
Çıxış:
15
Wrap Up
Rekursiya proqramlaşdırmada maraqlı bir anlayışdır. Bu, bizə mürəkkəb problemləri rekursiv, özünə istinad edən şəkildə həll etməyə imkan verir.
Problemlər haqqında düşünmək və həll etmək, onları daha kiçik, daha idarə edilə bilən parçalara bölmək üçün fərqli bir üsul təklif edir. Rekursiya ilə işləyərkən bəzi məqamlara diqqət yetirmək vacibdir.
Rekursiyanın bitməsinə imkan verən uyğun əsas halları müəyyən etməlisiniz. Əgər onlar mövcud deyilsə, funksiya özünü əbədi olaraq çağırmağa davam edə bilər.
İkincisi, mövcud ssenari əsasında müvafiq rekursiya növünün seçilməsi daha səmərəli və zərif həllərə gətirib çıxara bilər. Əlindəki problem üçün ən yaxşısını tapmağa çalışın. Geniş rekursiya dərinlikləri ilə işləyərkən yığının daşması kimi potensial təhlükələrdən xəbərdar olun.
Cavab yaz