Fonksiyonun girilen parametre değeri kadar kendisini tekrar etmesine recursive, rekürsif, özyineleme veya yinelenen fonksiyonlar denir. Bu haliyle bir döngü yapısına benzetilebilir ve döngüler gibi sonsuz sayıda tekrar etme hatasına düşebiliriz. Fonksiyonlar konusunda eksiğiniz varsa fonksiyonları ve parametreli fonskiyonları aşağıdaki link üzerinden tekrar etmenizi tavsiye ediyorum:
https://developer.mozilla.org/tr/docs/Web/JavaScript/Guide/Fonksiyonlar
Recursive Fonksiyonların Akışı
Fonksiyonlar parametre değeri aldıklarında, bu değer üzerinde işlemler gerçekleştirerek bir return (geri dönüş değeri) oluşturur. Recursive fonksiyonlar parametre değerini tekrardan aynı fonskiyonu çağırmak için kullanır. Fonksiyonu çağırdığımızda ilk olarak bir kontrol bloğu(base case) ile karşılaşır. Bu kontrol bloğundan geçerse, recursive işleminin bulunduğu ifade tekrardan kendisini çağırır. Bu durum kontrol bloğunda true değeri dönene kadar devam eder. True değeri hiç dönmezse, daha büyük bir problemle karşılaşırız.
Kontrol bloğu eklemezsek, fonksiyonumuz sürekli kendisini çağırdığı için sonsuz döngüye girecektir.
Recursive fonksiyonlar, döngülerle kurulan yapıları çok daha basit kod ifadeleriyle kurabilmemizi sağlar. Adım adım ilerleyerek Fibonacci sayı dizisinin istediğimiz terimini recursive fonksiyon olarak oluşturalım.
fibo adında tek parametre alan bir fonksiyon oluşturuyorum.
function fibo( sayi ){
}
Döngü yapılarında döngünün nerede sonlanmasına karar verdiğimiz bir blok her zaman olur:
> For yapısında ( değer ; koşul ; artış miktarı );
> do{ // }while( koşul );
Fonksiyonumuzun nerede durması gerektiğine karar vermek için, koşul ifadesi oluşturuyorum.
function fibo( sayi ){
if( sayi == 0 || sayi == 0 ){
}
}
Kontrol ifadesinden önce, recursive ifademi açıklamam daha anlaşılır olacaktır.
function fibo( sayi ){
if( sayi == 0 || sayi == 0 ){
}else{
return fibo( sayi - 1 ) + fibo( sayi - 2 );
}
}
Geri dönüş değerinde iki fonksiyon olması kafanızı karıştırmasın. Her ikisi de temelde aynı işlevi görüyor.
Parametre olarak 5 girelim, fibo( 5 ) olarak çalıştı, return ifadesine kadar… return içerisinde fibo( sayi-1 ) ifadesi ile karşılaştı. Burada durdu ve, içerisinde bulunduğu fonksiyonu 4 parametresi ile bir daha çağırdı. Aynı şekilde bu örüntü 3, 2, 1 sayıları ile devam edecek. Ta ki parametre değerimiz koşul değerimizde bulunan 1 veya 0 ile karşılaşana kadar.
Fonksiyon kontrol bloğundan her geçişinde tekrardan kendisini çağırıyor.
Döngü ile kurabileceğimiz her yapıyı recursive fonksiyonlar ile oluşturabilir ve okunabilirliğini arttırabiliriz. Bu ne kadar pozitif bir avantaj gibi gözükse de, recursive fonksiyonların karmaşıklığından dolayı pek tercih edilmeyen yapılardır.
Bir döngü yapısını düşünelim. Döngü yapısı içerisinde bunu oluşturmak mı daha kolay, yoksa iç içe defalarca kendisini çağıran bir fonksiyon oluşturmak mı? Fonksiyon ve parametre sayısı her çağırıldında artacağı için, döngü yapımıza kıyasla bellek alanı kullanımı artacaktır.