08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

C ve Sistem Programcıları Derneği - C Ders Notları - Necati Ergin<br />

ÖZYİNELEMELİ İŞLEVLER<br />

Bir işlev başka bir işlevi çağırdığı gibi kendisini de çağırabilir. Bu tür işlevlere özyinelemeli<br />

işlev (recursive functions) denir. Algoritmalar bu özelliğe göre üç ayrı gruba ayrılabilir:<br />

1- Özyinelemeli olmayan işlevlerle yazılabilen algoritmalar.<br />

2- Hem özyinelemeli olmayan hem de özyinelemeli işlevlerle yazılabilen algoritmalar.<br />

3- Yalnızca özyinelemeli işlevlerle yazılan algoritmalar.<br />

Özyinelemeli işlevlerle yazılması gereken tipik algoritmalar şunlardır:<br />

Dizin ağacını dolaşan algoritmalar<br />

Parsing algoritmaları<br />

Ağaç algoritmaları<br />

Özel amaçlı pek çok algoritma<br />

Bir algoritmanın kendi kendisini çağıran işlevlerle yazılıp yazılamayacağının ölçütü nedir?<br />

Algoritmada ilerlendiğinde yine ilk baştakine benzer bir durumla karşılaşılıyorsa büyük<br />

olasılıkla bu algoritma kendi kendini çağıran bir işlevle yazılabilir.<br />

Bir işlev kendini çağırdığında işlevin bütün yerel değişkenleri yeniden yaratılır. Aynı<br />

durum işlevin parametre değişkeni için de söz konusudur. Bu yüzden özyinelemeli işlevler<br />

genellikle yığın alanını diğer işlevlerle karşılaştırıldığında daha çok kullanır.<br />

Özyinelemeli işlevler işlemi gerçekleştirmek amacıyla bir süre kendi kendini çağırır. Daha<br />

sonra işlevlerden çıkış işlemleri başlar, yani çağrılan tüm işlevlerden geri çıkılmaya<br />

başlanır.<br />

Özyinelemeli İşlevlere Tipik Örnekler<br />

Aşağıda faktöriyel hesaplayan döngüsel (iterative) bir işlev yazılıyor:<br />

int fact(int n)<br />

{<br />

int result = 1;<br />

}<br />

while (n)<br />

result *= n--;<br />

return result;<br />

Aynı işlev özyinelemeli olarak da yazılabilir:<br />

int fact(int n)<br />

{<br />

if (n == 0 || n == 1)<br />

return 1;<br />

return n * factorial(n - 1);<br />

}<br />

İşlevin akışı şöyledir:<br />

n = 5 için val = 5 * factorial(4);<br />

n = 4 için val = 4 * factorial(3);<br />

n = 3 için val = 3 * factorial(2);<br />

n = 2 için val = 2 * factorial(1);<br />

n = 1 için return 1;<br />

519

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!