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. :)




Testing folder
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.

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.

Bundan əlavə rekursiyadan istifadə edərək ədədi yazı ifadəsinə çevirən koda burada baxa bilərsiniz.


Rekursiyadan istifadə üzrə məsləhətlər

Rekursiyanın tətbiqi vaxtı bu məsləhətləri nəzərdə tutun.

Təhlükəsizliyin sayğaclarının köməyi ilə sonsuz rekursiyanın qarşısını alın sayğac elə bir dəyişən olmalıdır ki, metod özü-özünə müraciət etdikdə bu dəyişəni yenidən yaratmasın.
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