1. Öz-özünü çağıran istənilən funksiya rekursiv funksiya adlanır. Problemin rekursiv həlli dedikdə, o başa düşülür ki, problem hər dəfə daha kiçik problemlə işləmək üçün özünün surətini(kopyasını) çağırır
1. Öz-özünü çağıran istənilən funksiya rekursiv funksiya adlanır. Problemin rekursiv həlli dedikdə, o başa düşülür ki, problem hər dəfə daha kiçik problemlə işləmək üçün özünün surətini(kopyasını) çağırır. Bu kimi, rekursiv addımlar, digər rekursiv çağırışlarla nəticələnə bilər. Yəni, hər funksiya müəyyən problem üçün özü özünü bir neçə və yaxud sonsuz sayda çağıra bilər. Bu isə bizi vadar edir ki, rekursiv əməliyyatları(rekursiya) müəyyən şərtlər altında mütləq sonlandıraq, tamamlandıraq. Digər sözlə, rekursiya sonlu olmalıdır. Daha sadə, izah etməli olsaq, rekursiya, bir problemin həlli üçün, daha kiçik, xırda hissələrlə, öz-özünü çağırması ardıcıllığıdır. Rekursiya riyaziyyatdan götürülmüş faydalı bir üsuldur(metoddur). Rekursiv üsulla yazılmış kod, ümumən iterativ üsulla yazılan koddan daha qısa, kodu yazmaq isə daha sadə olur. Rekursiya, bir-birinin oxşarı olan və alt tapşırıqlar kimi göstərilə bilən böyük həcmli tapşırıqların həllində daha faydalı olur. Məsələn,müəyyən verilənlər yığımınin sıralanması, onlar içərisində axtarış, kəsişmə problemlərinin, adətən, sadə rekursiv həlləri mövcuddur.
Rekursiv funksiya, bir tapşırığı icra etmək üçün, öz-özünü çağırmaqla alt tapşırıqları(subtasks) həll edir. Bir neçə icradan sonra, elə vəziyyət yaranır ki, alt tapşırıq daha öz-özünü çağırmadan icra olunur. Bu hala, əsas hal(base case) deyilir, harda ki, funksiya artıq rekursiv olmur(does not recur). Bundan öncəki, alt tapşırığı həll etmək üçün, funksiyanın öz-özünü çağırması hallarına isə rekursiv hal deyilir(cursive case). Rekursiv funksiyaya misal olaraq, faktorialın hesablanmasını göstərə bilərik. n! faktorial 1-dən n-ə qədər olan bütün ədədlərin hasilidir. Faktorialın açıqlaması: n! = 1, əgər n = 0 n! = n * (n - 1)!, əgər n > 0 Bu tərif(açıqlama) çox asanlıqla, rekursiv üsulla göstərilə də bilər. Daha sadə desək, tapşırığın özü n!-dir, lakin bir də bunun alt tapşırığı var (n - 1)!. Rekursiv hal üçün, n-nin 1-dən böyük hallarında,(n - 1)!-in dəyərini aşkarlamaq üçün funksiya öz-özünü çağırır və həmin qiyməti n-ə vurur. Bu funksiyanın əsas halı(base case) n 0 və ya 1 olanda qeydə alınır. Bu zaman heç bir rekursiv çağrışa ehtiyac olmadan 1 qaytarılır. Rekursiv üsulla faktorial hesablayan kod:
# Python kod def factorial(n): if n == 0 or n == 1: return 1 return n * factorial(n - 1)
Rekursiya Əsas hala(base case) çatdıqda, proqram dayanır. Hər öz-çağırış(recursive call) əlavə stack frame(yaddaş) işğal edir. Sonsuz, bitməyən(əsas hala çatmayan) rekursiv çağırışlar, yaddaşın bitməsinə və stack overflow ilə nəticələnə bilər. Bəzi problemlərə, bu üsulla həllər yazmaq, daha sadə, daha anlaşıqlı və daha qısa olur. İterasiya Şərt doğru olmayanda proqram dayanır. Hər iterasiya əlavə kopyanın yaddaşda saxlanmasına ehtiyac duymur. Məsələyə, problemə, iterativ üsulla həll yazmaq, ilk baxışdan tam aydın olmaya bilir.
Rekursiya haqqında qeydlər Rekursiv alqoritmlərin, 2 halı var, rekursiv hal və əsas hal. Hər bir rekursiv funksiya, əsas hala çatdıqda sonlanmalıdır. Ümumən götürdükdə, iterativ həllər, rekursiv həllərdən daha üstün hesab olunur(öz çağırışların çoxluğu səbəbi ilə). Rekursiv üsulla həll oluna bilən, problemin həm də iterativ üsulla həlli var. Bəzi problemlər üçün, aydın iterativ üsul mövcud olmur. Bəzi problemlər, məhz elə rekursiv üsulun malıdır, ona tam uyğundur, bəziləri isə yox.
2.8 Rekursiv alqoritmlərə misal: Fibonaççi ardıcıllığı, Faktorialın tapılması Birləşdirməklə sıralama(Merge Sort), Cəld sıralama(Quick Sort) İkili axtarış(binary search) Hanoy qüllələri problemi