Rekursiya
Rekursiya (recursio-latın sözü olub, tərcüməsi qayıtmaq mənasını verir)- metodun özü-özünə müraciət etməsi başa düşülür.
Belə bir deyim də var ki, rekursiyanı başa düşmək üçün gərək rekurisyanın özünü başa düşəsən. :)
Rekursiyanı daha aydın anlamaq üçün bir misala baxaq:
Ana qovluq "testing" olmaqla iç-içə olan bütün qovluqlardakı faylların siyahısını tərtib etmək lazımdır.
Belə bir deyim də var ki, rekursiyanı başa düşmək üçün gərək rekurisyanın özünü başa düşəsən. :)
![]() |
Testing folder |
Ana qovluq "testing" olmaqla iç-içə olan bütün qovluqlardakı faylların siyahısını tərtib etmək lazımdır.
public void listf(String directoryName, List<File> files) { File directory = new File(directoryName); // Get all files from a directory. File[] fList = directory.listFiles(); if(fList != null) for (File file : fList) { if (file.isFile()) { files.add(file); } else if (file.isDirectory()) { listf(file.getAbsolutePath(), files); } } }}
Istənilən rekursiv alqoritmi iterativ(dövr operatorlarını istifadə etməklə) yolla da yazmaq mümkündür.
Böyük həcmli proqramlarda bəzən rekursiya iterasiya ilə əvəz edilir.
İş ondadır ki, rekursiya metodunun özünə olan çoxlu müraciətlərin qarşılığında əldə olunan performansın dövr operatorları vasitəsilə yazılmış proqramların icrası ilə bağlı əldə olunan performans göstəricililərindən geri qalırlar.
Lakin rekurisya ilə yazılan proqramlar daha yığcam və aydın olur.
Başqa sözlə dövlər proqramların performans artımını təmin etdiyi halda, rekursiya proqramçıların performans artımını təmin edir.
İş ondadır ki, rekursiya metodunun özünə olan çoxlu müraciətlərin qarşılığında əldə olunan performansın dövr operatorları vasitəsilə yazılmış proqramların icrası ilə bağlı əldə olunan performans göstəricililərindən geri qalırlar.
Lakin rekurisya ilə yazılan proqramlar daha yığcam və aydın olur.
Başqa sözlə dövlər proqramların performans artımını təmin etdiyi halda, rekursiya proqramçıların performans artımını təmin edir.
Rekursiyadan istifadə üzrə məsləhətlər
Rekursiyanın tətbiqi vaxtı bu məsləhətləri nəzərdə tutun.
Rekursiyanı bir metodla məhdudlaşdırın Dövrü rekursiya(A metodu B metodunu B isə C metodunu ve C metodu A metodunu çağırır) çətin aşkar edildiyindən təhlükəlidir.
Stekə nəzarət edin Rekursiyadan istifadə zamanı proqramın stekdə nə qədər yer tutacağı haqda öncədən məlumatımız olmur.Bundan başqa proqramın özünü necə aparmağını əvvəlcədən müəyyən etmək olduqca çətindir. Ancaq bəzi yollarla nəzarəti ələ almaq mümkündür.
İlk olaraq, əgər təhlükəsizlik sayğacı dəyişəni nəzərə alınıbsa onda proqramın stekdə istifadə edə biləcək ölçünü nəzərə almaq olar. Beləki təhlükəsizlik sayğacına stekdə istifadə olunan ölçüdən daha azını mənimsətməklə stekin dolmasını qarşısını ala bilərik.
Daha sonra rekursiv metodda istifadə olunan lokal dəyişənlərə yaddaşın ayrılmasına nəzarət etmək lazımdır. Yaxşı olar ki, kompilyatorun obyektləri stekdə avtomatik yaratması əvəzinə obyektlərin heap də new istifadə eədərək yaradılsın.
No comments:
Post a Comment