Yazılım.
CevapSitesi.com Beta!
Çözüm Noktası
Facebook, Twitter, Google+ veya e-posta ile paylaşın.
| Sorular | Makaleler | Üyeler | Etiketler  | İletişim
Soru sormak ya da cevap vermek için;
giriş yapın veya üye olun.

Sosyal medya hesaplarınızla da giriş yapabilirsiniz.
0

JavaScript Fonksiyonları: Fonksiyonun Kendini Çağırması (Recursion)

Bir çok programlama dilinde olduğu gibi JavaScript fonksiyonları da kendilerini çağırabilir. Ancak bu durumda yine fonksiyon içinde kendini çağırma işini bir yerde biterecek bir kontrol mekanizması kurmak zorunludur. Aksi halde fonksiyon kendini çok fazla çağırdığında bir yığın taşması hatası alırız.

Ekrana gelen parametre değerlerini yazan basit bir örnek:

function yaz(adet) {
    if (adet > 1)
        yaz(adet - 1);
    console.log(adet);
}

yaz(5);

Çıktısı:
1
2
3
4
5

Verilen bir sayıya kadar tüm pozitif tam sayıları toplayan örnek:

function ekle(sayi) {
    if (sayi > 1)
        return sayi + ekle(sayi - 1);
    return sayi; // Sadece 1'i döndürür.
}

console.log(ekle(3));

Çıktısı:

6

Fonksiyon kendi içinden kendini çağırmaktadır. Çalışması şöyle olur:

  1. elke(3) ile fonsiyon çalıştırılır.
  2. Birinci çalıştırmada sayi değişkeninin değeri 3 olduğundan if'in altındaki return  satırı çalıştırılır. Burada da sayıya (3'e) ekle fonksiyonu sayi-1  ile (2 ile) çağırılarak dönen sayı eklenir. Ancak henüz dönen bir değer yoktur. Birinci çalıştırmanın fonksiyon kapsamında sayi değişkeninin değeri 3 olarak kalır ve fonksiyonun kendini çağırdıktan sonra dönen değeri beklenir.
  3. İkinci çalıştırmada sayi değişkeninin değeri 2'dir. Fonksiyonun bu defaki çağırılmasında oluşturulan fonksiyon kapsamında sayının değeri 2 olarak tutulacak ve buna fonksiyonun kendisini sayının bir eksiği ile (1 ile) çağırmasından gelecek sonuç beklenecektir.
  4. Üçüncü çalıştırmada sayi değişkeninin değeri 1'dir. Bu yüzden if sınamasından geçemez ve if'in altındaki satır çalıştırılmaz (Başka bahsettiğimiz kontrol mekanizması). Sonuçta bir alt satıra geçebilir ve sayi değişkeninin değeri (1 değeri) döndürülür. Bu noktada fonksiyonun kendi kendini çağırması tamamlanmış olur.
  5. 3. maddedeki çalıştırma kapsamına 1 değeri ile dönülür. Bu kapsamda sayi değişkeninin değeri 2 olduğundan 2 + Dönen Değer  yani 2 + 1 = 3 sonucu return ile döndürülür.
  6. 2. maddedeki çalıştırma kapsamına 3 değeri ile dönülür. Bu kapsamda sayi değişkeninin değeri 3 olduğundan 3 + DönenDeğer  yani 3 + 3 = 6 sonucu return ile döndürülür.
  7. Fonksiyon kendine başka çağrı yapmadığından program akışı console.log satırına gider ve sonuçta çıktıya son dönen değer yani 6 yazdırılır.
Örnekteki fonksiyon tek başına şu örnekteki işi yapar:

function ekle(sayi) {
    if (sayi > 1)
        return sayi + ekle1(sayi - 1);
    return sayi;
}
function ekle1(sayi) {
    if (sayi > 1)
        return sayi + ekle2(sayi - 1);
    return sayi;
}
function ekle2(sayi) {
    return sayi;
}

console.log(ekle(3));

Çıktısı:

6

Tabi bu örnek sadece 3'e kadar sayıları toplayabilir. Ancak hep aynı işlem fonksiyon ilk çağırılırken verilen parametre değeri adedince (örnekte 3) yapılacağından ve bu adet belirli bir değer olmayacağından fonksiyon başka bir fonksiyon yerine kendini çağırarak aynı işlemi farklı tekrar sayılarınca yapabilmektedir.

Bu işlem bir çeşit sahte kod ile şöyle izah edebilir :

function ekle(3) {
    if (3 > 1)
        return 3 + function ekle(2) {
                       if (2 > 1)
                           return 2 + function ekle(1) {
                                          if (1 > 1)
                                              ... // Burası 1 > 1 olmadığından çalışırılmaz.										  
                                          return 1; // Burası çalışır.
                                      };
                       return 2; // Burası çalışmaz.
                   };
    return 3; // Burası çalışmaz.
}

console.log(ekle(3));


JavaScript Fonksiyonları ile İlgili Makaleler: