
Merhaba Arkadaşlar,
Son zamanlarda MSP430 konusunda çok fazla soru aldım. Bunlardan bazıları Özyineli (Recursive) fonksiyonlar ile ilgili güzel sorulardı. Bende bu konu hakkında bir yazı yazmak istedim. O zaman kısaca özyineli yapının nasıl olduğunu anlatarak başlayalım.
Özyineli yapı genel olarak kendi kendini çağıran fonksiyonlar olarak tanımlanabilir. Yani biz fonksiyonumuzu bir değer vererek çağırıyoruz. Fonksiyonumuz bazı işlemler yapıyor daha sonra başka bir değer ile tekrar kendini çağırıyor ve bu işlem bitiş değerine kadar devam ediyor. Aslına bakarsak bizim döngüler kullanarak yaptığımız işlemlerin daha havalı hali olarak düşünülebilir. 🙂
O zaman bir örnek ile ne demek istediğimizi daha iyi anlamaya çalışalım. Örneğimizi ilk olarak C dilinde yazalım, daha sonra MSP430 için assembly örneğini yaparak yazımızı sonlandıralım. Hedefimiz 1’den N’e kadar olan sayıların toplamını döndüren bir fonksiyon yazmak olsun. Bunu döngü kullanarak şu şekilde yapabiliriz.
int ToplaDongu(int N){
toplam = 0;
for (i=1;i<=N;i++){
toplam = toplam + i;
}
return toplam;
}
Görüldüğü gibi döngüler kullanıldığında her şey gayet net. Şimdi özyineli yapıda bir fonksiyon yazalım.
int ToplaRekursif(int N){
if (N=1){
return 1;
}
return N + ToplaRekursif(N-1);
}
Bu fonksiyon 1’den N’e kadar olan sayıları toplayacağını iddia ediyor. 🙂 Bakalım gerçekten yapabiliyor mu? Deneme amaçlı N değerini 3’den başlatıp fonksiyonumuzun hangi adımları gerçekleştirdiğini inceleyelim.
- N=3 olduğu için “if” koşuluna girilmedi ve fonksiyon “3 + ToplaRekursif(2)” değerini döndürdü. Tabii bu değeri döndürebilmek için “ToplaRekursif” fonksiyonunu “2” değeri ile tekrar çağırdı.
- N=2 için yine koşula girilmedi ve fonksiyon “2 + ToplaRekursif(1)” değerini döndürdü. Bu sefer “ToplaRekursif” fonksiyonu “1” değeri ile tekrar çağrıldı.
- N=1 olduğu durumda koşul sağlandığı için fonksiyon “1” değerini döndürdü.
- Sonuç olarak;
- ToplaRekursif(3) = 3 + ToplaRekursif(2)
- ToplaRekursif(2) = 2 + ToplaRekursif(1)
- ToplaRekursif(1) = 1
- ToplaRekursif(3) = 3 + 2 + 1 = 6 oldu.
Gerçekten dediğini çok havalı biçimde yapan bir program. 🙂 Şimdi aynı işlemi assembly dilinde yapmaya çalışalım.
topla add R5,R6
adc R7
dec R5
jz son
call #topla
son ret
Evet birazcık döngü yapısına benzedi ancak assembly’de fonksiyon oluşturamadığımız için böyle alt programı kendi içinde tekrar çağıran yapı özyineli olarak düşünülebilir. Programın çalışmasına basitçe bakacak olursak.
- İlk olarak topla programı çağrıldığında R5 kaydedicisindeki sayı R6 ile toplanarak R6’ya kaydediliyor.
- Daha sonra eğer oluşmuşsa elde R7’ye kaydediliyor.
- Sonra R5’in değeri bir azaltılıyor ve R5 sıfıra ulaştığında programın bitmesi, ulaşmadığında ise programın tekrar çağrılması sağlanıyor.
- Sonuç olarak bu program çalıştıktan sonra 1’den R5 kaydedicisinde bulunan değere (N) kadar olan sayıların toplamı R7 ve R6 kaydedicilerinde saklanıyor.
Evet böylelikle basit olarak özyineli yapıyı öğrenmiş olduk. Bunun bize ne avantajı var derseniz? Bilmiyorum daha önce yaptığım hiçbir programda bu yapıyı kullanmadım, ancak illa ki havalı olmasının dışında bir avantajı vardır. 🙂 Böylelikle bir yazımızın daha sonuna geldik hepinize iyi çalışmalar dilerim.