Özyineleme
- C kursu
- Başlangıç
- Ders 69/116
- 5 dk
Bir fonksiyonun kendini çağırmasıyla özyinelemeyi öğrenirsin.
Özyineleme nedir?
Özyineleme (recursion), bir fonksiyonun kendini çağırmasıdır. Her çağrı, daha küçük bir problemi çözer.
int factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
int bes = factorial(5); /* 120 */Özyinelemeli fonksiyonun bir taban durumu (durdurucu koşul) olmalıdır; yoksa sonsuz çağrı olur ve program çöker. Burada taban durumu n <= 1'dir.
Çağrı yığını
Her özyinelemeli çağrı, çağrı yığınında (call stack) bir katman ekler. Taban durumuna ulaşınca katmanlar tek tek çözülür ve değerler birleşir.
factorial(3)
→ 3 * factorial(2)
→ 3 * (2 * factorial(1))
→ 3 * (2 * 1) = 6Çok derin özyineleme, yığını taşırabilir; bu yüzden büyük girdiler için döngü tercih edilir. Özyineleme, ağaç ve böl-ve-yönet algoritmalarında doğal görünür.
Uygulama Faktöriyel hesapla
int factorial(int n) özyinelemeli fonksiyonunu tanımla. n <= 1 ise 1 dönsün; değilse n * factorial(n - 1). main içinden printf("%d\n", factorial(5)); ile çağır. Çıktı 120 olmalı.
Başlangıç kodu
#include <stdio.h>
/* factorial özyinelemeli fonksiyonunu tanımla */
int main(void) {
/* printf %d ile factorial(5) çağır */
return 0;
}Örnek çözüm
#include <stdio.h>
int factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
int main(void) {
printf("%d\n", factorial(5));
return 0;
}Beklenen çıktı
120
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Özyineleme kavramlarını eşleştir
| Kavram | Anlamı |
|---|---|
taban durumu |
durdurur |
özyineleme |
kendini çağırır |
factorial(5) |
120 |
factorial(0) |
1 |
2 Özyinelemeli fonksiyonda taban durumu neden önemlidir?
- Hızı artırır
- Sonsuz çağrıyı önler Doğru cevap
- Belleği temizler
- Dönüş türünü belirler
Açıklama: Taban durumu olmazsa fonksiyon sonsuz kez kendini çağırır.
3 Taban durumu
int factorial(int n) {
if (n <= 1) return 1;
return n * ____;
}
int factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
Açıklama: Özyineleme: n * factorial(n - 1).